在 Node.js 的 fs
模块中,流(Streams) 是一个非常重要的概念。流用于处理读取或写入数据的持续过程。流不仅仅限于文件系统操作,它们是 Node.js 中处理数据的一种通用方式。
在 Node.js 中,流分为以下几种类型:
在文件系统操作中,最常使用的是可读流和可写流。
可读流允许你以流的方式读取数据,适用于处理大量数据,比如从文件中逐步读取数据而不是一次性读取全部数据到内存。
使用 fs.createReadStream()
方法可以创建一个可读流。
方法:fs.createReadStream(path[, options])
path
: 文件路径。options
: 配置选项对象(可选),可以包括:
flags
: 文件系统标志(默认为 'r'
读取)。encoding
: 字符编码(如 'utf8'
)。fd
: 文件描述符。mode
: 文件模式(权限)。autoClose
: 是否自动关闭文件(默认是 true
)。start
和 end
: 文件的起始和结束字节索引,用于读取文件的某个部分。highWaterMark
: 最高水位线(默认是 64KB),决定内部缓冲区的大小。const fs = require('fs');
const readableStream = fs.createReadStream('example.txt', { encoding: 'utf8' });
readableStream.on('data', (chunk) => {
console.log('Received chunk:', chunk);
});
readableStream.on('end', () => {
console.log('Finished reading file.');
});
readableStream.on('error', (err) => {
console.error('Error reading file:', err);
});
data
事件:每次读取数据块(chunk)时触发。end
事件:在读取流结束时触发。error
事件:在发生错误时触发。可写流用于向一个目标写入数据,比如写入文件或发送 HTTP 响应。
使用 fs.createWriteStream()
方法可以创建一个可写流。
方法:fs.createWriteStream(path[, options])
path
: 文件路径。options
: 配置选项对象(可选),可以包括:
flags
: 文件系统标志(默认为 'w'
写入)。encoding
: 字符编码(如 'utf8'
)。fd
: 文件描述符。mode
: 文件模式(权限)。autoClose
: 是否自动关闭文件(默认是 true
)。start
: 写入文件的起始字节位置。highWaterMark
: 最高水位线(默认是 16KB),决定内部缓冲区的大小。const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt', { encoding: 'utf8' });
writableStream.write('Hello, world!\n', 'utf8', () => {
console.log('Finished writing chunk.');
});
writableStream.end('This is the end of the file.', 'utf8', () => {
console.log('Finished writing to file.');
});
writableStream.on('finish', () => {
console.log('All writes are now complete.');
});
writableStream.on('error', (err) => {
console.error('Error writing to file:', err);
});
write()
方法:写入数据到流。end()
方法:写入结束符号并关闭流。finish
事件:当所有数据已被成功写入目标时触发。error
事件:在发生错误时触发。在 Node.js 中,管道(Pipes) 是一种用于连接可读流和可写流的方法,允许数据从一个流自动流入另一个流。这是处理流数据的最常见模式之一。
pipe()
方法方法:readableStream.pipe(destination[, options])
destination
: 可写流。options
: 配置选项对象(可选)。const fs = require('fs');
const readableStream = fs.createReadStream('source.txt');
const writableStream = fs.createWriteStream('destination.txt');
readableStream.pipe(writableStream);
readableStream.on('end', () => {
console.log('File has been copied successfully.');
});
readableStream.on('error', (err) => {
console.error('Error reading file:', err);
});
writableStream.on('error', (err) => {
console.error('Error writing file:', err);
});
pipe()
方法:将数据从一个流传输到另一个流。end
事件:当读取完成时触发。error
事件:在发生错误时触发。data
、end
、error
和 finish
),来控制数据流动和处理错误。paused
(暂停)和 flowing
(流动)状态。Node.js 的文件系统模块提供了对文件和目录的强大操作功能,而流是 Node.js 中处理数据的核心组件之一。通过理解和使用流,尤其是可读流、可写流和管道,可以在 Node.js 中更高效地处理大数据集或实时数据。流的非阻塞和事件驱动特性使其成为 Node.js 应用程序处理文件 I/O 操作的一个强大工具。