You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Deno中使用ReadableStream和WritableStream进行读写操作?

在Deno中实现ReadableStream到WritableStream的数据传输

Deno完全遵循标准Web Stream API,你可以直接用原生流操作方法完成可读流到可写流的数据传输,核心是pipeTo()方法。下面是几个实用示例:

基础内存流传输示例

这个示例演示在内存中创建可读流,将数据管道传输到可写流并收集结果:

// 创建可读流:输出二进制数据块
const readable = new ReadableStream({
  start(controller) {
    // 用TextEncoder将字符串转为Uint8Array(流默认处理二进制数据)
    controller.enqueue(new TextEncoder().encode("Hello, Deno Streams!\n"));
    controller.enqueue(new TextEncoder().encode("测试流传输功能\n"));
    // 关闭可读流,告知没有更多数据
    controller.close();
  },
});

// 创建可写流:收集并处理传入的数据
let collectedContent = "";
const writable = new WritableStream({
  // 处理每个数据块
  write(chunk: Uint8Array) {
    collectedContent += new TextDecoder().decode(chunk);
  },
  // 流关闭时执行的逻辑
  close() {
    console.log("传输完成,收集到的数据:\n", collectedContent);
  },
  // 流终止时的错误处理
  abort(reason) {
    console.error("流传输终止:", reason);
  },
});

// 执行管道传输:await确保传输完成
await readable.pipeTo(writable);

文件流复制示例

这是实际开发中最常用的场景:从一个文件的可读流传输到另一个文件的可写流:

// 打开源文件,获取可读流
const sourceFile = await Deno.open("source.txt", { read: true });
const fileReadable = sourceFile.readable;

// 打开目标文件,获取可写流(create: true 表示不存在则创建,truncate: true 表示清空已有内容)
const targetFile = await Deno.open("target.txt", { write: true, create: true, truncate: true });
const fileWritable = targetFile.writable;

// 执行管道传输,完成后关闭文件句柄
try {
  await fileReadable.pipeTo(fileWritable);
  console.log("文件复制完成");
} catch (err) {
  console.error("文件复制失败:", err);
} finally {
  sourceFile.close();
  targetFile.close();
}

关键参数与错误处理

  • pipeTo()选项:可以传入第二个参数配置传输行为,比如preventClose: true表示可读流结束后不自动关闭可写流,适合需要复用可写流的场景:
    await readable.pipeTo(writable, { preventClose: true });
    
  • 错误捕获:流传输过程中的错误会抛出异常,务必用try/catch包裹pipeTo()调用,避免程序崩溃。

内容的提问来源于stack exchange,提问作者thebluetropics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:45:48