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

本篇文章给大家剖析一下nodejs中的文件流,希望对大家有所帮助!

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

文件流

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

文件流主要有三种,分别为输入流(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配置项默认为 truereadable.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');})

登录后复制

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2705407.html

(0)
上一篇 2025年3月7日 19:51:23
下一篇 2025年2月26日 05:02:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 深入了解Node.js中的VM模块

    vm模块是nodejs里面的核心模块,支撑了require方法和nodejs的运行机制,我们有些时候可能也要用到vm模板来做一些特殊的事情。本篇文章就来带大家详细了解下node中的vm模块,希望对大家有所帮助! 参考文献 vm 虚拟机 | …

    2025年3月7日
    200
  • nodejs中全局变量有什么

    在nodejs中,全局变量有两个:1、“__filename”, 表示当前正在执行的脚本的文件名,可输出文件所在位置的绝对路径;2、“__dirname”,表示当前执行脚本所在的目录。 本教程操作环境:windows7系统、nodejs 1…

    2025年3月7日
    200
  • nodejs为什么火了

    nodejs火了的原因:1、Node在服务端和客户端都是使用JS,开发人员在各层上只需使用一门语言;2、Node容易学会,对于开发者来说易转型;3、支持NoSQL数据库;4、有很好的IDE和代码编辑器支持;5、代码托管服务支持广泛等。 本教…

    2025年3月7日
    200
  • nodejs中path.join和path.resolve的对比,聊聊它们的区别

    本篇文章带大家了解一下nodejs中的path.join和path.resolve,介绍一下path.join和path.resolve的区别,希望对大家有所帮助! 相信小伙伴们都对这两个方法path.join、path.resolve不陌…

    2025年3月7日
    200
  • 怎么改变nodejs的版本

    改变方法:1、利用nvm工具,执行“nvm install 指定版本号”命令可切换至指定版本,“nvm install lastest”命令可升级到最新版;2、利用Node Binary管理模块,执行“n 指定版本号”命令可切换至指定版本。…

    2025年3月7日
    200
  • 聊聊调试 Node.js 代码的两种方式

    如何调试你的 node 代码?下面本篇文章给大家介绍一下两种常见的调试 node.js 的方式,有一定的参考价值,希望对大家有所帮助! 很多时候,我苦恼于 Node.js 的调试,只会使用 console.log 这种带有侵入性的方法,但是…

    2025年3月7日 编程技术
    200
  • 认识nodejs中的全局对象,看看它与浏览器中全局对象的区别

    本篇文章带大家了解一下node中的全局对象,介绍一下nodejs全局对象与浏览器中的全局对象的区别,希望对大家有所帮助! node中,一个.js文件就是一个完整的作用域(module,模块)。因此 var 声明的变量只在当前.js文件中有效…

    2025年3月7日
    200
  • node.js 显示乱码怎么办

    node.js显示乱码的解决办法:1、通过记事本查看nodeJs的编码格式,并设置编码格式为utf-8;2、在js文件中增加编码说明即可。 本文操作环境:Windows7系统,nodejs v5.10.1版,Dell G3电脑。 node.…

    2025年3月7日 编程技术
    200
  • 聊聊nodejs如何实现钉钉单聊机器人(步骤分享)

    nodejs如何实现钉钉单聊机器人?本篇文章给大家介绍一下使用node实现钉钉单聊机器人的步骤,希望对大家有所帮助! 要实现的效果 通过预先配置问答库和语义识别能力,在群内对钉钉自定义机器人@的消息进行实时响应。 实现步骤 1.创建和发布机…

    2025年3月7日 编程技术
    200
  • 一文聊聊Node.js中的模块路径解析

    本篇文章带大家了解一下node.js中的模块路径解析,介绍一下node模块路径解析方法,希望对大家有所帮助! require案例 当前有一个项目当前项目路径/Users/rainbow/Documents/前端/脚手架开发/rainbow-…

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论