- NodeJs的介绍及使用
- Node.js核心模块概览
- NodeJs-Assertion Testing
- NodeJs-Asynchronous Context Tracking
- NodeJs-async_hooks
- NodeJs-Buffer
- Node.js- C++ Addons
- Node.js-C++ Addons Node-API
- NodeJs-C++ Embedder API
- Node.js-Child Process
- NodeJs-Cluster
- Node.js-命令行选项
- Node.js-Console
- Node.js-Corepack
- Node.js-Crypto
- NodeJs-Debugger
- NodeJs-Diagnostics Channel
- NodeJs-DNS
- NodeJs-Domain
- NodeJs-Errors
- NodeJs-Events
- NodeJs-File system(一)
- NodeJs-File system(二)
- NodeJs-File system(三)
- NodeJs-Globals
- NodeJs-HTTP
- NodeJs-HTTP/2
- NodeJs-HTTPS
- NodeJs-Inspector
- NodeJs-Internationalization
- NodeJs-Modules CommonJS modules、ECMAScript modules、node:module、Packages、TypeScript
- NodeJs-Net
- NodeJs-OS
- NodeJs-path
- NodeJs-Performance Hooks
- NodeJs-Permissions
- NodeJs-process
- NodeJs-punycode
- Node.js-querystring
- NodeJs-Readline
- NodeJs-REPL
- NodeJs-Report
- NodeJs-Single Executable Applications
- NodeJs-SQLite
- NodeJs-Stream
- NodeJs-String Decoder
- NodeJs-Test runner
- NodeJs-Timers
- NodeJs-TLS/SSL
- NodeJs-Trace events
- NodeJs-TTY
- NodeJs-UDP/datagram
- NodeJs-URL
- NodeJs-Utilities
- NodeJs-V8
- NodeJs-VM
- NodeJs-WASI
- NodeJs-Web Crypto API
- NodeJs Web Streams API
- NodeJs Worker threads
- NodeJs-Zlib
- NodeJs-Single Executable Applications
NodeJs-File system(二)
class Stream在 Node.js 的 fs
模块中,流(Streams) 是一个非常重要的概念。流用于处理读取或写入数据的持续过程。流不仅仅限于文件系统操作,它们是 Node.js 中处理数据的一种通用方式。
1. 流的种类
在 Node.js 中,流分为以下几种类型:
- 可读流(Readable Stream):从中读取数据的流。
- 可写流(Writable Stream):可以向其写入数据的流。
- 双工流(Duplex Stream):既是可读流又是可写流。
- 转换流(Transform Stream):一种双工流,数据可以在读取和写入时被修改或转换。
在文件系统操作中,最常使用的是可读流和可写流。
2. 可读流(Readable Stream)
可读流允许你以流的方式读取数据,适用于处理大量数据,比如从文件中逐步读取数据而不是一次性读取全部数据到内存。
创建可读流
使用 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
事件:在发生错误时触发。
3. 可写流(Writable Stream)
可写流用于向一个目标写入数据,比如写入文件或发送 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
事件:在发生错误时触发。
4. 管道(Pipes)
在 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
事件:在发生错误时触发。
5. 使用流的注意事项
- 高效内存使用:流通过分块处理数据(例如按 64KB 的块)来优化内存使用,而不是一次性加载全部数据到内存中,这对于处理大文件或数据流非常重要。
- 事件驱动:流是事件驱动的,因此你需要监听适当的事件(如
data
、end
、error
和finish
),来控制数据流动和处理错误。 - 流的状态:可读流和可写流都有不同的状态,了解它们的状态有助于更好地控制流的操作。例如,可读流有
paused
(暂停)和flowing
(流动)状态。
6. 总结
Node.js 的文件系统模块提供了对文件和目录的强大操作功能,而流是 Node.js 中处理数据的核心组件之一。通过理解和使用流,尤其是可读流、可写流和管道,可以在 Node.js 中更高效地处理大数据集或实时数据。流的非阻塞和事件驱动特性使其成为 Node.js 应用程序处理文件 I/O 操作的一个强大工具。
评论区
评论列表
{{ item.user.nickname || item.user.username }}