SpringBoot+WebFlux通过流式响应实现类似ChatGPT的打字机效果

news/2025/1/13 15:41:40/文章来源:https://www.cnblogs.com/juyss/p/18243087

突然间想用Java实现一下像ChatGPT一样的打字机输出效果,但是网上搜了相关教程感觉都不够满意。
这里贴一下自己的实现,为中文互联网做一点小小的贡献

最主要的一点就是响应的Content-Type设置为MediaType.TEXT_EVENT_STREAM_VALUE


实现效果如下

然后贴一下自己的代码吧
思路就是把从文件读取的每一个字符重新合并为一个数组,当然,也可以替换成从其他地方获得的字符
通过fromArray()方法将包装好的字符数组一个个按顺序返回,通过delayElements()指定一个延迟时间,从而实现类似ChatGPT的打字机效果

我这里是从resources/static/test.txt读取文件,通过转换后得到Character[]数组,一定要是包装类数组,基本数据类型不行。

感觉代码不够优雅,转换个字符竟然这么麻烦,希望能有大佬指点。

import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;import java.io.IOException;
import java.time.Duration;/*** @author Juyss* @version 1.0* @description: TODO* @date 2024/6/11 20:52*/
@RestController
@RequestMapping("/chat")
public class ChatController {@GetMapping(value = "/webflux",produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<Character> chatWebFlux(@RequestParam int delay) throws IOException {//读取文件作为字符串数组数据来源DefaultResourceLoader resourceLoader = new DefaultResourceLoader();Resource resource = resourceLoader.getResource("classpath:static/test.txt");byte[] byteArray = resource.getContentAsByteArray();String s = new String(byteArray);char[] charArray = s.toCharArray();//将基本数据类型的字符数组包装为引用数据类型Character[] characters = String.valueOf(charArray).chars().mapToObj(b -> (char) b).toArray(Character[]::new);//通过fromArray()方法将包装好的字符数组一个个按顺序返回,通过delayElements()指定一个延迟时间,从而实现类似ChatGPT的打字机效果return Flux.fromArray(characters).delayElements(Duration.ofMillis(delay));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/723343.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调整Aplayer的歌词颜色和字体大小显示

该段CSS代码的修改主要是为了增强音乐播放器中歌词的可读性和视觉效果。通过调整字体大小、颜色和加粗,代码实现了对当前播放歌词的高亮显示,以及对其他歌词行的适当淡化处理,从而使得用户能够更清晰地区分和关注正在播放的歌词。同时,通过平滑的过渡效果,增强了用户的视觉…

[Paper Reading] Tesla AI Day for FSD Beta

link FrameworkOccupancy 模型结构比较像ICCV 2023的OccNet的做法,不过还会额外预测Suface以及NeRF state,预测可行驶区别suface的好处是可以辅助Planning&Control给出更加准确的运动速度等信息(比如,上下坡可根据suface坡度做更准确判断)。Lanes Neural Network 比较有…

R语言上市公司经营绩效实证研究 ——因子分析、聚类分析、正态性检验、信度检验|附代码数据

全文链接:http://tecdat.cn/?p=32747 原文出处:拓端数据部落公众号 随着我国经济的快速发展,上市公司的经营绩效成为了一个备受关注的话题。本文旨在探讨上市公司经营绩效的相关因素,并运用数据处理、图示、检验和分析等方法进行深入研究,帮助客户对我国45家上市公司的16…

R语言经济学:动态模型平均(DMA)、动态模型选择(DMS)预测原油价格时间序列

原文链接:http://tecdat.cn/?p=22458 原文出处:拓端数据部落公众号简介 本文提供了一个经济案例。着重于原油市场的例子。简要地提供了在经济学中使用模型平均和贝叶斯方法的论据,使用了动态模型平均法(DMA),并与ARIMA、TVP等方法进行比较。希望对经济和金融领域的从业…

Go语言goroutine调度器初始化

1、调度器初始化 调用点:src/runtime/asm_amd64.s:349 -> CALL runtimeschedinit(SB) runtime/proc.go : 526func schedinit() { // raceinit must be the first call to race detector. // In particular, it must be done before mallocinit below calls racemapshadow.…

龙哥量化:通达信空信号,可以买入翻倍的指标公式源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889{当多空线上穿0轴以后并且沿着45度向上运行时可视为有效突破,此时的信号可视为有效信号。信号出现在平台盘整期间,或者是小多头回调之后向上拉升之际,此时的信号最为有效,其它时间的信号要仔细辨别…

龙哥量化:通达信筹码操盘,筹码来的副图源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889 DRAWGBK(ISLASTBAR, RGB(60,60,60),RGB(0,0,0),0,0,0); 机构控盘区:160,COLORMAGENTA ,LINETHICK1; DRAWTEXT(ISLASTBAR, 机构控盘区,-- ←机构控盘区),COLORMAGENTA ; 主升浪:150,COLORRED ,LINETHIC…

私有化部署bitwarden密码管理器(一)——环境准备

碎碎念 现在各种网站和手机APP都要求设置密码和输入密码,每个人都要设置大量的密码。如果都设为统一密码,就存在一旦一个密码被攻破,其他密码都失效的情况。如果要分别设置为不同密码,那么记住密码又成了一个困难的问题。所以密码管理工具也就应运而生,比较有名的密码管理…

私有化部署bitwarden密码管理器(三)——nginx方式部署

仅有IP无证书的环境部署bitwarden密码管理器 虽然使用npm方式部署比较简单,但是很多小伙伴可能没有一台带域名国外vps,接下来介绍仅有IP的Vps,如国内的服务器无域名证书或者是本地无外网的环境如:虚拟机、NAS、树莓派等环境部署bitwarden密码管理器。 部署Nginx Nginx和Nginx…

龙哥量化:诺曼底防线副图指标公式源码

如果您需要代写公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889VAR1:=(HHV(H,13)-LLV(L,13));VAR2:=(HHV(H,13)-C);VAR3:=(C-LLV(L,13));VAR4:=VAR2/VAR1*100-70;VAR5:=(C-LLV(L,55))/(HHV(H,55)-LLV(L,55))*100;VAR6:=(2*C+H+L)/4;VAR7:=SMA((VAR3/VAR1*100),3,1);…

【PB案例学习笔记】-05 图片浏览器

写在前面 这是PB案例学习笔记系列文章的第5篇,该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project…

Cursor是什么?基于ChatGPT代码编辑器的cursor如何使用?VS Code如何迁移到Cursor的步骤

Cursor 是一个基于 Visual Studio Code(VS Code)技术构建的高级代码编辑器,专为提高编程效率并更深度地整合 AI 功能而设计。它不仅继承了 VS Code 的强大功能和用户界面,还增加了专门针对 AI 支持的特色功能。Cursor 是 VS Code 的一个分支,这意味着它基于 VS Code 的代码…