一、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);
11-21 11:39