如何在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
相关产品推荐
相关产品推荐

