前端需要去了解的nodejs知识(fs文件流)

简介: 上文中我们所说的文件的增删改查处理都是直接打开完整的文件,此种方式在遇到大文件读写时性能问题较大,但除了这种方式还有其他的方式来处理,可以使用流的方式来对文件进行分片处理。下面来介绍下nodejs中这种处理方式。

上文中我们所说的文件的增删改查处理都是直接打开完整的文件,此种方式在遇到大文件读写时性能问题较大,但除了这种方式还有其他的方式来处理,可以使用流的方式来对文件进行分片处理。下面来介绍下nodejs中这种处理方式。

文件流


前文已经说明nodejs中的文件流是对文件的分片处理,文件流也可以说是另一种读写文件的方式,更加适用于大文件的处理,目的是为了节省IO的内存使用率。

nodejs的文件流

  • 可读流(Readable):数据从源头流向内存,把磁盘里面的数据传输到内存里面,即数据读取。
  • 可写流(Writable):写入一个数据,可以将字符串或buffer写入文件,即数据写入。

网络异常,图片无法展示
|

流的使用api

nodejs中文件流的操作主要是stream模块,其内部实现了两个类可读流(Readable)和可写流(Writable)。另外文件流的基础实现是事件流机制。

  • 创建可读流:fs.createReadStream(filePath,{options}),返回一个可读流对象,该对象可以用来操作文件流以及监听文件流的传输,options中有以下参数可以设置:
  • flag: 'r',
  • encoding: null, // 设置编码方式
  • fd: null,
  • mode: 438, // 十进制
  • start: number, // 设置可读流的开始读取位置
  • end: number,  // 设置可读流的结束读取位置
  • highWaterMark: number(kb) // 每个chunk的最大体积
const filename=__dirname+'/demo.json';
//highWaterMark 设置
const readStream = fs.createReadStream(fileName,{highWaterMark:1});
let data = ''
//监听文件流传输
readStream.on('data',(chunk)=>{
    console.log('=========')
    data = data + chunk;
})
readStream.on('end',(chunk)=>{
    console.log('file read end')
})
readStream.on('error',(err)=>{
    console.log(err)
})
  • 创建可写流:fs.createWriteStream(filePath,options),返回一个可写流对象,options中的参数和可读流一样。
const fileWriteName = __dirname + '/fsdir2/demo2.txt';
const writeStream = fs.createWriteStream(fileWriteName);
//写入数据
writeStream.write("0000", () => {
        console.log('数据写完了000')
    })
//监听写入关闭的操作
writeStream.on('close', (fd) => {
    console.log('文件关闭了', fd)
})
writeStream.end()
//监听文件写入完成
writeStream.on('end', () => {
    console.log('当数据被清空之后')
})
  • 管道的使用:以上的可读和可写流可以看出我们传递数据虽然被转换成了流,但仍然需要获取到文件的所有内容才能继续进行,当我们使用管道就不会遇到此问题,下面看一个文件复制的例子:

网络异常,图片无法展示
|

const filename=__dirname+'/demo/demo.txt';
const readStream = fs.createReadStream(filename,{highWaterMark:1});
const fileWriteName = __dirname + '/demo/demo2.txt';
const writeStream = fs.createWriteStream(fileWriteName);
//直接通过管道传输流不用一次性传输了
readStream.pipe(writeStream)
复制代码

总结


文件使用流的方式处理已经深入服务器中,这种方式能大大的提升系统的性能以及可用率。普通方式的处理个人也会经常使用在一些小文件的脚本处理。文件各种的处理方式大家应当在合适的场景应用合适的方式。


相关文章
|
5月前
|
JavaScript 前端开发 API
Node.js在前端的妙用:打造更出色的Web体验
Node.js在前端的妙用:打造更出色的Web体验
267 5
|
5月前
|
前端开发
前端接受后端文件流并下载到本地的方法
前端接受后端文件流并下载到本地的方法
1266 0
|
5天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
17 0
|
5天前
|
前端开发 JavaScript 程序员
【从前端入门到全栈】Node.js 之核心概念
【从前端入门到全栈】Node.js 之核心概念
|
5天前
|
Web App开发 JavaScript 前端开发
前端Node.js面试题
前端Node.js面试题
|
5天前
|
Web App开发 JavaScript 前端开发
对于 前端 解释下 node.js的必要性
对于 前端 解释下 node.js的必要性
7 0
|
2月前
|
JSON JavaScript 前端开发
JS的无限可能: 前端 精妙DOM技巧至Node.js的服务端
JS的无限可能: 前端 精妙DOM技巧至Node.js的服务端
|
2月前
|
JavaScript IDE 前端开发
前端开发工具配置 nodejs & git & IDE
前端开发工具配置 nodejs & git & IDE
|
2月前
|
资源调度 前端开发 JavaScript
前端 nodejs 命令行自动调用编译 inno setup 的.iss文件
前端 nodejs 命令行自动调用编译 inno setup 的.iss文件
|
3月前
|
Web App开发 存储 JavaScript
前端如何学习Node.js及Node.js的主要用途
【7月更文挑战第16天】 学习Node.js对前端开发者至关重要,涉及理解其基于V8的运行时环境、JavaScript基础、安装与验证、核心模块(如fs、http、path)及npm管理。实践项目,如用Express建服务器,参与开源,深入学习异步编程和事件循环。Node.js用于服务器开发、构建工具、本地开发服务器和实时应用,提升全栈能力。借助官方文档和各种资源加速学习。
59 4