NodeJs 第三章 文件I/O、文件流
2023-12-26 18:57:33
文件I/O
I/O(input/output) 对外部设备的输入输出, IO的速度往往低于内存和CPU的交互速度
外部设备,例如
- 磁盘
- 网卡
- 显卡
- 打印机
fs模块
模块能够以标准 POSIX 函数为模型的方式与文件系统进行交互
- fs.readFile(读取一个文件)
- fs.writeFile(向文件写入内容)
- fs.stat(获取文件或目录信息)
- size: 占用字节
- atime:上次访问时间
- mtime:上次文件内容被修改时间
- ctime:上次文件状态被修改时间
- birthtime:文件创建时间
- isDirectory():判断是否是目录
- isFile():判断是否是文件
- fs.readdir(获取目录中的文件和子目录)
- fs.mkdir(创建目录)
- fs.exists(判断文件或目录是否存在)
- fs.exists 在 v1.0.0 版本弃用,官方推荐使用 fs.stat 和 fs.access
文件流
什么是流
流是指数据的流动,数据从一个地方缓缓的流动到另一个地方
流是有方向的
- 可读流: Readable(数据从源头流向内存)
- 可写流: Writable(数据从内存流向源头)
- 双工流:Duplex(数据即可从源头流向内存
又可从内存流向源头)
为什么需要流
-
其他介质和内存的数据规模不一致
-
其他介质和内存的数据处理能力不一致
文件流
什么是文件流
内存数据和磁盘文件数据之间的流动
如何创建文件流
-
fs.createReadStream(path[, options])
- 创建一个文件可读流,用于读取文件内容
- path:读取的文件路径
- options:可选配置
- encoding:编码方式
- start:起始字节
- end:结束字节
- highWaterMark:每次读取数量
- 如果encoding有值,该数量表示一个字符数
- 如果encoding为null,该数量表示字节数
- 返回:Readable的子类ReadStream
- 事件:rs.on(事件名, 处理函数)
- open(文件被打开后触发)
- error(发生错误时触发)
- close(文件被关闭后触发)
- 可通过rs.close手动关闭或文件读取完成后自动关闭(autoClose配置项默认为true)
- data(读取到一部分数据后触发)
- 注册data事件后,才会真正开始读取
- 每次读取highWaterMark指定的数量
- 回调函数中会附带读取到的数据
- 若指定了编码,则读取到的数据会自动按照编码转换为字符串
- 若没有指定编码,读取到的数据是Buffer
- end(所有数据读取完毕后触发)
- rs.pause()
- 暂停读取, 会触发pause事件
- rs.resume()
- 恢复读取,会触发resume事件
- 事件:rs.on(事件名, 处理函数)
-
fs.createWriteStream(path[, options])
- 创建一个写入流
- path:写入的文件路径
- options
- flags:操作文件的方式
- w:覆盖
- a:追加
- encoding:编码方式
- start:起始字节
- highWaterMark:每次最多写入的字节数
- flags:操作文件的方式
- 返回:Writable的字类WriteStream
- ws.on(事件名, 处理函数)
- open
- error
- close
- ws.write(data): 写入一组数据
-
data可以是字符串或Buffer
-
返回一个boolean值
- true:写入通道没有被填满,接下来的数据可以直接写入,无须排队
- false:写入通道目前已被填满,接下来的数据将进入写入队列
要特别注意背压问题,因为写入队列是内存中的数据,是有限的
- true:写入通道没有被填满,接下来的数据可以直接写入,无须排队
-
当写入队列清空时,会触发drain事件
-
- ws.end([data])
- 结束写入,将自动关闭文件
- 是否自动关闭取决于autoClose配置(默认true)
- data是可选的,表示关闭前的最后一次写入
- 结束写入,将自动关闭文件
- ws.on(事件名, 处理函数)
-
rs.pipe(ws)
- 将可读流连接到可写流
- 该方法可解决背压问题
文章来源:https://blog.csdn.net/aXin_li/article/details/135225309
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!