• 技术文章 >web前端 >js教程

    深入浅析node.js中的文件流

    青灯夜游青灯夜游2021-11-23 17:58:20转载386
    本篇文章给大家剖析一下Nodejs中的文件流,希望对大家有所帮助!

    文件流

    由于电脑中的各种介质读存的速度不同、容量大小不同,因此可能在操作中会有一方存在长期等待的状态

    文件流主要有三种,分别为输入流(Readable)输出流(Writeable)双工流(Duplex)。其中还有一种流不常用那就是 转换流(Transform)

    node 中提供了 stream 模块,这个模块中有两个类实例:Readable 和 Writable,流中都会继承这两个类,因此会有很多共同的方法等。

    可读流(Readable)

    输入流:数据从源头流向内存,把磁盘里面的数据传输到内存里面。

    createReadStream

    fs.createReadStream(路径, 配置)

    在配置里面有:encoding(编码方式)、start(起始读取字节)、end(结束读取字节)、highWaterMark(每次读取量)

    highWaterMark:如果encoding有值,该数量表示一个字符数;如果encoding为null,该数量表示字节数

    返回一个Readable的子类ReadStream

    const readable = fs.createReadStream(filename, { encoding: 'utf-8', start: 1, end: 2, // highWaterMark: });

    注册事件

    readable.on(事件名,处理函数)

    readable.on('open', (err, data)=> {
        // console.log(err);
        console.log('文件打开了');
    })
    
    readable.on('error', (data, err) => {
        console.log(data, err);
        console.log('读取文件发生错误');
    })
    
    readable.on('close', (data, err) => {
        // console.log(data, err);
        console.log('文件关闭');
    })
    
    readable.close() // 手动触发通过 readable.close()或者在文件读取完毕之后自动关闭--autoClose配置项默认为 true
    
    readable.on('data', (data) => {
        console.log(data);
        console.log('文件正在读取');
    })
    
    readable.on('end', ()=>{
        console.log('文件读取完毕');
    })

    暂停读取

    readable.pause() 暂停读取,会触发 pause 事件

    恢复读取

    readable.resume() 恢复读取,会触发 resume 事件

    可写流

    const ws = fs.createWriteStream(filename[, 配置])

    ws.write(data)

    写入一个数据,data 可以使字符串也可以是Buffer,返回一个布尔值。

    如果返回的是 true 表示写入通道没有被占满,接下来的数据可以直接写入,写入通道就是配置中的 highWaterMark 表示的大小。

    如果返回的是false 表示写入通道占满,其余字符开始等待,出现背压情况。

    const ws = fs.createWriteStream(filename, {
        encoding: 'utf-8',
        highWaterMark: 2
    })
    
    const flag = ws.write('刘');
    console.log(flag); // false 
    这里虽然只会执行一次,但是在通道有空余空间的时候就会继续写入,并不在返回 值。
    
    ws.write() 只会返回一次值。
    
    
    const flag = ws.write('a');
    console.log(flag);
    const flag1 = ws.write('a');
    console.log(flag1);
    const flag2 = ws.write('a');
    console.log(flag2);
    const flag3 = ws.write('a');
    console.log(flag3);
    
    输出顺序:true、false、false、false
    
    第二次写入的时候已经占了两字节,第三次写入后直接占满了,所以返回false

    使用流复制粘贴文件,并解决背压问题

    const filename = path.resolve(__dirname, './file/write.txt');
    const wsfilename = path.resolve(__dirname, './file/writecopy.txt');
    
    const ws = fs.createWriteStream(wsfilename);
    const rs = fs.createReadStream(filename)
    
    rs.on('data', chumk => {
        const falg = ws.write(chumk);
        if(!falg) {
            rs.pause();
        }
    })
    
    ws.on('drain', () => {
        rs.resume();
    })
    
    rs.on('close', () => {
        ws.end();
        console.log('copy end');
    })

    pipe

    使用 pipe 也可以直接将 可读流 和 写入流串联起来,也可以解决背压问题

    rs.pipe(ws);
    
    rs.on('close', () => {
        ws.end();
        console.log('copy end');
    })

    学习下来,感觉文件流在大量文件读写的时候是很方便的,并且可以做到快速高效,相比于writeFilereadFile效率要高很多,正确处理也不会有很大的阻塞出现。

    更多node相关知识,请访问:nodejs 教程!!

    以上就是深入浅析node.js中的文件流的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:node.js 文件流
    上一篇:javascript怎么将对象转化为数组 下一篇:jquery怎么为标签增加属性
    Web大前端开发直播班

    相关文章推荐

    • nodejs怎么将buffer转换为JSON对象• 浅析怎么利用npkill快速找到和删除node_modules• 浅谈Nodejs+nodemailer怎么发送邮件• node项目中怎么使用Node Schedule创建定时任务• 聊聊Node.js中的事件驱动程序和EventEmitter类
    1/1

    PHP中文网