fetch 支持流式读取响应体,需通过 response.body.getreader() 获取 reader,用 textdecoder 流式解码 uint8array 块,处理 ndjson/sse 时需缓冲分行解析,并在 finally 中 cancel() 防泄漏。

Fetch 支持流式读取响应体,关键在于使用 response.body(一个 ReadableStream)配合 getReader() 逐步读取 Uint8Array 块,再按需解码为文本或处理二进制数据。
获取可读流并创建 reader
调用 fetch() 后,先等待响应头就绪(await response),再通过 response.body.getReader() 获取流读取器。注意:body 只能被读取一次,且必须确保响应有 Content-Type 或明确知道编码方式。
- 检查
response.body是否存在(某些响应如 204、304 可能无 body) - 避免直接调用
response.text()或response.json(),否则流会被消耗掉 - reader 的
read()方法返回 Promise,每次 resolve 一个{ done, value }对象
逐块读取并解码为字符串
对每个 Uint8Array 块使用 TextDecoder 解码,注意处理多字节字符跨块边界的情况(TextDecoder 默认支持流式解码,无需手动拼接)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 推荐在循环外初始化
const decoder = new TextDecoder("utf-8") - 每次
decoder.decode(chunk, { stream: true })——stream: true告诉解码器可能还有后续数据 - 最后一次调用
decoder.decode(chunk)(不带stream: true)收尾,确保残留字节被正确处理
处理 JSON 流(如 Server-Sent Events 或 NDJSON)
若后端以换行分隔的 JSON(NDJSON)或 SSE 格式推送,可在解码出文本后按行分割,再对每行 JSON.parse()。
- 维护一个缓冲字符串(
let buffer = ""),把每次解码出的文本追加进去 - 用
buffer.split("\n")切分行,保留最后一行作为未结束的缓冲(可能缺换行符) - 对每条完整行尝试解析,捕获
SyntaxError并跳过无效行(如注释或空行)
错误与中断处理
流读取过程可能因网络中断、响应取消或 reader 被释放而提前终止,需主动监听和清理。
- 在
finally块中调用reader.cancel()或reader.releaseLock()防止内存泄漏 - 捕获
read()Promise 的 rejection(如TypeError: Failed to fetch或AbortError) - 如需中止请求,应传入带
AbortController的signal给fetch(),而非仅关闭 reader
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










