一、Readable
const fs = require('fs');
// 创建文件的Readable
const reader = fs.createReadStream('./test.txt', {
start: 8, // 文件读取开始的位置
end: 18, // 文件读取结束的位置
highWaterMark: 4 // 一次性读取字节的长度,默认是64kb;
})
// 监听 read 数据
reader.on('data', (data) => {
console.log(data.toString());
})
// 监听打开文件
reader.on('open', (fd) => {
console.log('文件被打开!');
})
// 监听读取结束
reader.on('end', () => {
console.log('文件读取结束!');
})
// 监听关闭文件
reader.on('close', () => {
console.log('文件被关闭!');
})
二、Writable
// 创建文件的Writable
const writer = fs.createWriteStream('./test.txt', {
flags: 'a+', // 追加写入
start: 8 // 写入位置
});
// 写入数据
writer.write("Hello OUTMAN", () => {
console.log('写入成功!');
})
// 监听文件打开
writer.on('open', () => {
console.log('文件被打开!');
})
// 监听文件关闭(无法监听)
// 无法监听的原因:写入流在打开后不会自动关闭,必须手动触发来通知node已经写入结束,并发射finish事件
writer.on('close', () => {
console.log('文件被关闭!'); // 无法监听,不打印
})
// 手动close后, finish ---> close
writer.close();
writer.on('finish', () => {
console.log('文件写入完成!');
})
writer.on('close', () => {
console.log('文件被关闭!');
})
// 直接使用end,end = write传值 + 文件close,一步到位
writer.end('Hello Outman!')
三、pipe方法
// pip方法
const reader = fs.createReadStream('./test.txt');
const writer = fs.createWriteStream('./copy.txt');
// 常规方法,嵌套 read & write
reader.on('data', (data) => {
console.log(data);
writer.write(data, (err) => {
console.log(err);
})
})
// 利用pipe实现
reader.pipe(writer);