NodeJS中的Stream:读写文件的高效工具

0 下载量 181 浏览量 更新于2024-09-01 收藏 79KB PDF 举报
"本文主要介绍NodeJS中Stream的基本使用,特别是可读流的创建和流动状态,以及如何监听数据和结束事件。" 在NodeJS中,处理文件操作时,核心模块`fs`提供了多种API,包括`createReadStream`和`createWriteStream`,用于创建可读流和可写流,以便高效地处理大文件或内存不确定的情况。这些流接口避免了一次性加载整个文件到内存,从而减少了内存压力。 ### 可读流 #### 创建可读流 使用`fs.createReadStream()`方法创建可读流。该方法接收两个参数:文件路径和一个包含选项的对象。其中,`start`和`end`分别指定了读取的起始和结束位置,`highWaterMark`定义了缓存区的大小,它影响了数据读取的频率。例如: ```javascript let fs = require("fs"); let rs = fs.createReadStream("1.txt", { start: 0, end: 3, highWaterMark: 2 }); ``` #### 流动状态 可读流有两种状态:暂停和流动。在流动状态下,数据会根据`highWaterMark`设定的值持续读取并触发"data"事件,直到文件读取完毕。例如: ```javascript rs.on("data", data => { console.log(data); }); rs.on("end", () => { // 文件读取结束后的操作 }); ``` 当`data`事件被触发时,每次都会提供一定量的数据,通常是`highWaterMark`设定的值。当没有更多的数据可读时,会触发`end`事件。 ### 监听事件 除了"data"和"end"事件,还有其他一些重要的事件: - `error`:当发生错误时触发,如文件不存在或读取权限问题。 - `close`:流关闭时触发,通常在所有数据处理完成后关闭流。 - `open`:文件打开成功时触发,这发生在流开始读取之前。 ### 数据处理 在流动模式下,数据会自动读取,如果不希望立即处理所有数据,可以使用`pause()`方法暂停流,使用`resume()`方法恢复读取。另外,`destroy()`方法可以立即终止流并清理资源。 ### 可写流 与可读流类似,`createWriteStream`用于创建可写流。数据通过`write()`方法写入,当写入完成且缓冲区清空时,会触发`finish`事件。如果需要确保所有数据都已写入磁盘,可以在`finish`事件后进行后续操作。 NodeJS中的Stream机制是处理大量数据的关键工具,它可以有效地管理内存和提高程序性能。理解和熟练使用Stream对于编写高效的NodeJS应用至关重要。