【NodeJS】fs 模块 (2)

流式文件写入 & 读取

流式文件写入 / 读取适合操作大文件


流式写入

① 创建可写流:fs.createWriteStream(path[, options])

  1. path:文件路径
  2. options:配置对象
    • flags:文件系统标志,默认值为 'w'
    • encoding:数据的编码格式,默认为 utf8
  • 返回值:WriteStream 对象
const fs = require('fs');
let ws = fs.createWriteStream('./WS.txt');
  • 创建可写流后,可写流会自动开启,写入完成后需要手动关闭

② 写入数据:ws.write(data)

  1. data:需要写入的数据
const fs = require('fs');
let ws = fs.createWriteStream('./WS.txt');let content = '需要写入的内容';
ws.write(content);
ws.write('  追加的内容');

③ 通过监听流的 openclose 事件来监听流的开关

因为 openclose 操作都只会出现一次,所以这里使用 once() 绑定事件

const fs = require('fs');
const ws = fs.createWriteStream('./WS.txt');const content = '需要写入的内容';
ws.write(content);
ws.write('  追加的内容');// 监听 open 事件
ws.once('open', (_) => console.log('可写流打开了'));
// 监听 close 事件
ws.once('close', (_) => console.log('可写流关闭了'));
  • 可以看见,只打印了 可写流打开了,因为可写流会自动开启,但不会自动关闭

④ 关闭可写流:ws.close([callBack]) / ws.end([callBack])

  • callBack:回调函数,关闭可写流后调用;接收一个参数 err,默认为 null
const fs = require('fs');
const ws = fs.createWriteStream('./WS.txt');const content = '需要写入的内容';
ws.write(content);
ws.write('  追加的内容');ws.once('open', (_) => console.log('可写流打开了'));// 调用 close 方法关闭可写流
ws.close((_) => console.log('可写流关闭了'));

流式读取

① 创建可读流:fs.createReadStream(path)

  1. path:文件的路径
  • 返回值:ReadStream 对象
const fs = require('fs');
let rs = fs.createReadStream('./WS.txt');
  • 创建可读流后,可读流会自动开启。但此时还不会读取数据!
  • 我们可以通过 rs.readableFlowing 查看数据是否已经在读取:null-未读取、true-正在读取、false-读取完,已关闭

② 给可读流绑定一个 data 事件,绑定完毕后,会自动开始读取数据(每次最多读取 65536 byte)

回调函数接收一个参数 datadata 就是可读流传出的数据(二进制数据)

const fs = require('fs');
const rs = fs.createReadStream('./WS.txt');rs.on('data', (data) => {console.log('开始读取数据');console.log('data', data);
});
  • 读取完后,可读流会自动关闭

③ 通过监听流的 openclose 事件来监听流的开关

因为 openclose 操作都只会出现一次,所以这里使用 once() 绑定事件

const fs = require('fs');
const rs = fs.createReadStream('./WS.txt');// 监听 open & close 事件
rs.once('open', (_) => console.log('readStream open!'));
rs.once('close', (_) => console.log('readStream close!'));rs.on('data', (data) => {console.log('开始读取数据');console.log('data', data);
});

demo:配合可写流使用

const fs = require('fs');
const rs = fs.createReadStream('./rs.txt');
const ws = fs.createWriteStream('./ws.txt');// 监听 data 事件,开启可读流
rs.on('data', (data) => {console.log('开始读取数据');console.log('data', data + ''); // 打印可读流里面的数据ws.write(data); // 写入读取到的数据
});// 监听可读流
rs.once('open', (_) => console.log('ReadStream open!'));
rs.once('close', (_) => {console.log('ReadStream close!');ws.end(); // 可读流关闭后,手动关闭可写流
});// 监听可写流
ws.once('open', (_) => console.log('WriteStream open!'));
ws.once('close', (_) => console.log('WriteStream close!'));

管道 pipe

pipe():可以将可读流中的数据,直接传到可写流中

const fs = require('fs');
const rs = fs.createReadStream('./WS.txt');
const ws = fs.createWriteStream('./123.txt');rs.pipe(ws); // 开启可读流,写入读取到的数据,写入完毕后自动关闭可写流// 监听可读流
rs.once('open', (_) => console.log('ReadStream open!'));
rs.once('close', (_) => console.log('ReadStream close!'));// 监听可写流
ws.once('open', (_) => console.log('WriteStream open!'));
ws.once('close', (_) => console.log('WriteStream close!'));

同步文件写入

openSync

① 打开文件:fs.openSync(path[, flags])

  1. path:文件路径

  2. flags:文件系统标志

    • 'r' (read):读取数据。如果文件不存在,则报错(默认)

    • 'w' (write):写入数据。如果文件不存在,则创建该文件;否则覆盖文件原内容

    • 'a' (add):追加数据。如果文件不存在,则创建该文件;否则追加内容

返回值:表示文件描述符的整数 fd

const fs = require('fs');// 打开文件
const fd = fs.openSync('new.txt', 'w');
console.log('fd'); // fd 3

writeSync

② 写入内容:fs.writeSync(fd, data[, position[, encoding]])

  1. fd:表示文件描述符的整数
  2. data:需要写入的内容
  3. position:开始写入的位置(eg:2 → 空两位再开始写数据)
  4. encoding:写入的数据编码格式,默认为 utf8
  • 返回值:写入的字节数
  • 如果 data 是普通的对象,则它必须具有自己的(不是继承的)toString 方法
const fs = require('fs');const fd = fs.openSync('hello.txt', 'w');// 写入数据
const len = fs.writeSync(fd, 'hello superman');
console.log('len', len); // len 14

closeSync

③ 关闭文件:fs.closeSync(fd)

  1. fd:表示文件描述符的整数
const fs = require('fs');const fd = fs.openSync('hello.txt', 'w');
fs.writeSync(fd, 'hello superman');// 关闭文件
fs.closeSync(fd);

写入完成后,需要关闭文件,避免资源的浪费



异步文件写入

open

① 打开文件:fs.open(path[, flags], callback)

  1. path:文件的路径

  2. flags:文件系统标志

    • 'r' (read):读取数据。如果文件不存在,则报错(默认)

    • 'w' (write):写入数据。如果文件不存在,则创建该文件;否则覆盖文件原内容

    • 'a' (add):追加数据。如果文件不存在,则创建该文件;否则追加内容

  3. callBack:回调函数,打开文件后调用,接收 2 个参数:

    • err:错误信息,默认为 null

    • fd:表示文件描述符的整数

const fs = require('fs');// 打开文件
fs.open('hello.txt','w',(_) => console.log(arguments) // [Arguments] { '0': null, '1': 3 }
);

write

② 写入数据:fs.write(fd, string[, position[, encoding]], callback)

  1. fd:表示文件描述符的整数

  2. string:需要写入的内容

  3. position:开始写入的位置(eg:2 → 空两位再开始写数据)一般不写

  4. encoding:写入的数据编码格式,默认为 utf8,一般不写

  5. callBack:回调函数,接收 3 个参数:

    • err:错误信息,默认为 null

    • len:写入的字节数

    • data:写入的数据内容

const fs = require('fs');// 打开文件
fs.open('hello.txt', 'w', (err, fd) => {// 写入数据fs.write(fd, '异步写入的内容', (_) => {console.log(arguments); // [Arguments] { '0': null, '1': 21, '2': '异步写入的内容' }});
});

close

③ 关闭文件:fs.close(fd, callBack)

  1. fd:表示文件描述符的整数
  2. callBack:回调函数,接收 1 个异常参数 err,默认为 null
const fs = require('fs');// 打开文件
fs.open('hello.txt', 'w', function (err, fd) {if (err) return console.log('err', err);console.log('open');// 写入数据fs.write(fd, '异步写入的内容', (err) => {if (err) return console.log('err', err);console.log('write');// 关闭文件fs.close(fd, function (err) {if (err) return console.log('err', err);console.log('close');});});
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android battery saver 简单记录

目录 一. battery saver模式的policy (1) DEFAULT_FULL_POLICY 对应的配置和解释: (2) OFF_POLICY 对应的配置也就说不使用policy (3) 获取省电模式下的policy: 二. 对各个参数代码讲解 (1) adjustBrightnessFactor (2) enableAdjustBrightness (3) advertiseIsEnabled…

ctfshow——文件包含

文章目录 web 78——php伪协议第一种方法——php://input第二种方法——data://text/plain第三种方法——远程包含(http://协议) web 78——str_replace过滤字符php第一种方法——远程包含(http://协议)第二种方法——data://&…

070:vue中provide、inject的使用方法(图文示例)

第070个 查看专栏目录: VUE 本文章目录 示例背景示例效果图示例源代码父组件代码子组件代码孙组件代码 基本使用步骤 示例背景 本教程是介绍如何在vue中使用provide和inject。在 Vue 中,provide 和 inject 是用于实现祖先组件向后代组件传递数据的一种方式。 在这个…

oracle 触发器事前触发和事后触发区别

Oracle触发器的事前触发和事后触发主要在触发的时机和触发器内部的操作上有所区别。 触发时机:事前触发器是在触发事件发生之前运行,而事后触发器则在触发事件发生之后运行。 获取的数据:事前触发器通常可以获取到事件发生前和新的字段值。O…

Docker存储空间清理

不知不觉服务器存储空间被Docker掏空了… 查看Docker空间占用情况 使用docker system df命令,可以加 -v 查看详情 清理Docker不需要的内容 使用docker system prune -a命令清理Docker 所有停止的容器所有没有被使用的networks所有没容器的镜像所有build cache …

公共用例库计划--个人版(六)典型Bug页面设计与开发

1、任务概述 本次计划的核心任务是开发一个,个人版的公共用例库,旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理,并以提高用例的复用率为目标,力求最大限度地减少重复劳动,提升…

图论练习4

内容:染色划分,带权并查集,扩展并查集 Arpa’s overnight party and Mehrdad’s silent entering 题目链接 题目大意 个点围成一圈,分为对,对内两点不同染色同时,相邻3个点之间必须有两个点不同染色问构…

Elasticsearch:入门

1. 介绍Elasticsearch 1.1 什么是Elasticsearch Elasticsearch是一款基于开源的分布式搜索和分析引擎,构建在Apache Lucene之上。它旨在提供一个强大且灵活的工具,使用户能够以高效、实时的方式存储、检索和分析大量数据。 1.2 Elasticsearch的主要特…

自动化测试报告生成【Allure】

之前尝试使用过testNG自带的测试报告、优化过reportNG的测试报告,对这两个报告都不能满意。后经查找资料,发现有个神器: Allure(已经有allure2了,笔者使用的就是allure2),生成的测试报告与上述…

异或加密原理及简单应用(C语言版)

加密原理: 异或加密是一种基于异或运算的简单加密算法。在二进制运算中,异或(XOR)的规则是: 0 XOR 0 00 XOR 1 11 XOR 0 11 XOR 1 0 这意味着如果两个比特相同,则结果为0,否则结果为1。异…

八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Implicit GEMM conv)

目录 前言0. 简述1. 什么是Implicit GEMM Conv2. Explicit GEMM Conv3. Implicit GEMM Conv4. Implicit GEMM Conv优化5. spconv和Implicit GEMM Conv总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记&#xff0…

Python 中的 __doc__ 属性是用来做什么的?Python 中的 logging 模块是用来做什么的?如何配置日志记录?

Python 中的 doc 属性是用来做什么的? doc 是 Python 中用于存储文档字符串(docstring)的特殊属性。文档字符串是与模块、类、函数或方法相关联的字符串,用于提供对其功能和使用的简要描述。 主要用途: 文档和注释&a…

WiFi 6 和WiFi 6e 的核心要点

目录 WiFi 6 是什么? WiFi 6/6e 的主要feature功能: 80Mhz and 160Mhz channel 1K QAM WiFi6 支持2.4G band OFDMA:Orthogonal frequency division multiple access OFDMA先把频段分为:Resource Units (RUs) Subcarriers …

使用 Visual Studio Code 在远程计算机上调试 PostgreSQL

使用 Visual Studio Code 在远程计算机上调试 PostgreSQL 1. 概述 PostgreSQL 是一个功能强大的开源关系数据库管理系统,适用于各种应用程序。在开发过程中,调试 PostgreSQL 对于识别和解决问题至关重要。在本博客中,我们将手把手教你使用客…

创建自己的Hexo博客

目录 一、Github新建仓库二、支持环境安装Git安装Node.js安装Hexo安装 三、博客本地运行本地hexo文件初始化本地启动Hexo服务 四、博客与Github绑定建立SSH密钥,并将公钥配置到github配置Hexo与Github的联系检查github链接访问hexo生成的博客 一、Github新建仓库 登…

Windows SDK(四)鼠标和键盘消息处理

鼠标基础知识 鼠标一般分为三种状态,三个按钮 三种状态:单击,双击,拖动 三个按钮:左键(LBUTTON),右键(RBUTTON),中键(MBUTTON&…

【计算机视觉】目标检测 |滑动窗口算法、YOLO、RCNN系列算法

一、概述 首先通过前面对计算机视觉领域中的卷积神经网络进行了解和学习,我们知道,可以通过卷积神经网络对图像进行分类。 如果还想继续深入,会涉及到目标定位(object location)的问题。在图像分类的基础上(Image classification)的基础上…

JAVA中的多态参数

1.方法定义的参数类型为父类类型,实参类型允许为子类类型 public class Ploy_parameter {public static void main(String[] args) {Manage jack new Manage("jack",12000,3000);Staff tom new Staff("tom",10000);Ploy_parameter ploy_para…

【Linux系统化学习】进程等待

目录 进程等待 进程等待的必要性 进程等待的方法 wait方法 等待一个进程(阻塞等待) waitpid方法 任意等待多个进程(阻塞等待) 父进程获取子进程的退出信息 非阻塞轮询等待 进程等待 进程等待的必要性 之前讲过,子进程退…

javascript设计模式之建造者

工厂模式不关心过程,只关心结果,这与建造者相反,建造者更关心的是过程, 这里我们创建一个基类,其拥有技能跟爱好两个属性,还有两个实例方法用来获取技能跟爱好 // 基类 let Human function (param {}) …