加入收藏 | 设为首页 | 会员中心 | 我要投稿 泉州站长网 (https://www.0595zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Nodejs中的文件流如何理解,有什么好处?

发布时间:2022-02-08 15:02:34 所属栏目:语言 来源:互联网
导读:这篇文章我们来了解Nodejs中的文件流,有很多新手对用户Nodejs中的文件流不是很理解的,对此下文给大家来详细的介绍一下,感兴趣的朋友不妨了解看看,对大家会有一定的帮助,那么接下来就跟随小编来一起学习一下吧! 文件流 由于电脑中的各种介质读存的速度
      这篇文章我们来了解Nodejs中的文件流,有很多新手对用户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');
})

(编辑:泉州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读