【NodeJS】fs 模块 (2)

news/2024/7/11 0:39:22 标签: 前端, javascript, es6, node.js

流式文件写入 & 读取

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


流式写入

① 创建可写流: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.niftyadmin.cn/n/5363411.html

相关文章

ICLR 2024 | Mol-Instructions: 面向大模型的大规模生物分子指令数据集

发表会议:ICLR 2024 论文标题:Mol-Instructions: A Large-Scale Biomolecular Instruction Dataset for Large Language Models 论文链接:https://arxiv.org/pdf/2306.08018.pdf 代码链接:https://github.com/zjunlp/Mol-Instruct…

MySQL篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、SQL优化二、简单说一说drop、delete与truncate的区别三、什么是视图四、什么是内联接、左外联接、右外联接?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

Unity项目从built-in升级到URP(包含早期版本和2023版本)

unity不同版本的升级URP的方式不一样,但是大体流程是相似的 首先是加载URP包 Windows -> package manager,在unity registry中找到Universal RP 2023版本: 更早的版本: 创建URP资源和渲染器​​ 有些版本在加载时会自动创建&#…

uniapp本地存储的几种方式localStorage

在uniapp开发中,本地存储是一个常见的需求。本地存储可以帮助我们在客户端保存和管理数据,以便在应用程序中进行持久化存储。本文将介绍uniapp中本地存储的几种方式,以及相关的代码示例。 介绍 在移动应用开发中,我们经常需要将…

【智能家居入门3】(MQTT服务器、MQTT协议、微信小程序、STM32)

前面已经写了三篇博客关于智能家居的,服务器全都是使用ONENET中国移动,他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器,有公用的,也可以自己搭建(应该要钱)&#xf…

建网站建设的目的是什么?为什么要建网站建设?

在当今数字化时代,互联网已经渗透到我们生活的方方面面。企业网站作为互联网的重要组成部分,不仅是企业形象展示的窗口,更是企业与目标受众互动和沟通的桥梁。本文将深入探讨企业网站建设的核心目的与意义,以及为何企业需要一个优…

Docker基础与持续集成

docker 基础知识: docker与虚拟机 !左边为虚拟机,右边为docker环境 – Server :物理机服务器Host OS :构建的操作系统Hypervisor :一种虚拟机软件,装了之后才能虚拟化操作系统Guest OS :虚拟化的操作系统…

直播主播岗位面试

主播作为当下热门的职业,需要具备一定的专 业素质和技能。在面试主播岗位时,面试官通常会从多个方面对求职者进行评估,以确保其具备胜任该岗位的各项能力。本文将围绕自我介绍、直播经验、内容策划能力、互动技巧、仪表形态、粉丝运营、抗压与…