Node.js 文件描述符和文件读取

news/2024/12/22 9:15:21/

目录

1、文件描述符

2、读取文件

3、stream(流)

3.1 流的类型


1、文件描述符

在您能够与文件系统中的文件进行交互之前,您必须获得一个文件描述符。

文件描述符是对打开文件的引用,是通过使用fs模块提供的open()方法打开文件返回的数字(fd)。此数字(fd)唯一标识操作系统中打开的文件:

const fs = require('fs');
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {// fd 文件描述符
});

fs.open(path, flags, mode, callback)

  • path 路径
  • 标志选项,例如r:可读,r+ 可读写
  • mode 默认值:0o666(可读写)
  • fd 文件描述符

通常使用的其他标志有:

标志

描述

不存在则创建

r+

此标志打开文件进行读取和写入

X

w+

此标志打开文件进行读取和写入,并将流定位在文件的开头

v

a

这个标志打开文件进行写入,它还将流定位在文件的末尾

v

a+

这个标志打开文件进行读写,它还将流定位在文件的末尾

v

as同步模式下打开追加文件。v
as+在同步模式下打开文件进行读取和追加v
rs+以同步模式打开文件进行阅读v

您也可以使用fs.openSync方法打开文件,该方法返回文件描述符,而不是在回调中提供:

const fs = require('fs');
try {const fd = fs.openSync('/Users/joe/test.txt', 'r');
} catch (err) {console.error(err);
}

一旦您获得了文件描述符,无论您选择什么方式,您都可以执行所有需要它的操作,比如调用fs.close()和许多其他与文件系统交互的操作。

您也可以使用fs/promises模块提供的基于promise的fsPromises.open方法打开文件。

fs/progress模块仅从Node.js v14开始提供。在v14之前,在v10之后,您可以使用require('fs').proness。在v10之前,在v8之后,您可以使用util.proisify将fs方法转换为基于promise的方法。

const fs = require('fs/promises');
// Or const fs = require('fs').promises before v14.
async function example() {let filehandle;try {filehandle = await fs.open('/Users/joe/test.txt', 'r');console.log(filehandle.fd);console.log(await filehandle.readFile({ encoding: 'utf8' }));} finally {if (filehandle) await filehandle.close();}
}
example();

以下是util.prostify的一个示例:

const fs = require('fs');
const util = require('util');
async function example() {const open = util.promisify(fs.open);const fd = await open('/Users/joe/test.txt', 'r');
}
example();

2、读取文件

在Node.js中读取文件的最简单方法是使用fs.readFile()方法,向其传递文件路径、编码和回调函数,该函数将与文件数据(以及错误)一起调用:

const fs = require('fs');
fs.readFile('/Users/joe/test.txt', 'utf8', (err, data) => {if (err) {console.error(err);return;
}console.log(data);
});

fs.readFile(path, option, callback)

  • path 文件名或文件描述符
  • options 包括字符编码,文件系统标志,signal(允许中断正在读的readFile)等。
  • callback err:错误,data:读取文件的数据

使用AbortSignal中止正在进行的请求。如果a 如果请求被中止,则使用AbortError调用回调:

import { readFile } from 'node:fs';const controller = new AbortController();
const signal = controller.signal;
readFile(fileInfo[0].name, { signal }, (err, buf) => {// ...
});
// 中断请求
controller.abort();

或者,您可以使用同步版本fs.readFileSync():

const fs = require('fs');
try {const data = fs.readFileSync('/Users/joe/test.txt', 'utf8');console.log(data);
} catch (err) {console.error(err);
}

您还可以使用fs/promises模块提供的基于promise的fsPromises.readFile()方法:

const fs = require('fs/promises');
async function example() {
try {const data = await fs.readFile('/Users/joe/test.txt', { encoding: 'utf8' });console.log(data);
} catch (err) {console.log(err);
}
}
example();

fs.readFile()、fs.readFileSync()和fsPromises.readFile()这三个函数在返回数据之前都会读取内存中文件的全部内容

这意味着大文件将对内存消耗和程序执行速度产生重大影响。

在这种情况下,更好的选择是使用流读取文件内容

3、stream(流)

流是一个抽象接口,用于在Node.js中处理流数据。 node:stream模块提供实现流接口的API。

Node.js提供了许多流对象。例如,一个  请求到HTTP服务器请求到HTTP服务器请求到HTTP服务器 和process.stdoutprocess.stdoutprocess.stdout 都是流实例。

流可以是可读的、可写的或两者兼有。

要访问node:stream模块:

const stream = require('stream');

3.1 流的类型

Node.js中有四种基本的流类型:

  • Writable:数据可被写入的流(例如, fs.createWriteStream() ).
  • Readable:可从中读取数据的流(例如, fs.createReadStream() ).
  • Duplex:两者都是的流 Readable 和 Writable (for例如, net.Socket ).
  • Transform: Duplex 数据流,可以修改或转换数据 被写入和读取(例如,zlib.createDeflate() ).

通过提供fs选项,可以覆盖对应的fs openreadclose的实现。当提供fs选项时, 需要对read进行覆盖。如果未提供fd,则将覆盖 open也需要。如果autoClosetrue还需要覆盖关闭。

import { createReadStream } from 'node:fs';// 从某些字符设备创建流。
const stream = createReadStream('/dev/input/event0');
setTimeout(() => {stream.close(); // 这可能不会关闭流。// 人工标记流尾, 就像基础资源已经// 指示文件结束本身,允许流关闭。// 这不会取消挂起的读取操作,如果有这样的// 操作,进程可能仍然无法成功退出// 直到它完成stream.push(null);stream.read(0);
}, 100);

如果autoClose为false,则文件描述符不会被关闭,即使 出错了。应用程序负责关闭它并使 确保没有文件描述符泄漏。如果autoClose设置为true(默认值 行为),则在'error''end'上,文件描述符将被关闭 自动地。

读取100字节长的文件的最后10个字节的示例:

import { createReadStream } from 'node:fs';createReadStream('sample.txt', { start: 90, end: 99 });


http://www.ppmy.cn/news/80743.html

相关文章

11 - YOLO算法二 (目标检测)

要点: 三 YOLO v3 3.1 Darknet-53 (backbone) 3.2 目标边界框的预测 将预测的边界框中心限制在当前cell中, s(x) Sigmoid(x) 。 3.3 正负样本的匹配 3.4 损失的计算 3.4.1 置信度损失 (Binary Cross Entropy) 其中 表示预测…

python+mysql电影推荐系统 影院售票选座系统vue

随着互联网的蓬勃发展,现代社会进入了以计算机为中心的信息时代,计算机技术正以一种前所未有的持久方式改变着世界的面貌。应用网络技术电影推荐系统受到许多用户的重视。网站的开发可以对人们的交流起到重要的作用,因此,为了满足…

C Primer Plus第四章编程练习答案

学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出! 1.编写一个程序,提示用户输…

如何在 Axios 中去控制 Loading?大有学问!

目录 前言 按钮loading 局部loading 全局loading 前言 loading 的展示和取消可以说是每个前端对接口的时候都要关心的一个问题。这篇文章将要帮你解决的就是如何结合axios更加简洁的处理loading展示与取消的逻辑。 首先在我们平时处理业务的时候loading一般分为三种&#x…

完全二叉树——堆的概念及实现

前言 堆(heap):是堆内存的简称,堆是动态分配内存,内存大小不固定,也不会自动释放,堆——数据结构是一种无序的树状结构,同时它还满足key-value键值对的存储方式。 1. 堆的概念及结构 如果有一个关键码的…

Sharding-JDBC分库分表

Sharding-JDBC分库分表 一 分库分表概述 ​ 分库分表,就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分为若干数据表组成,使得单一数据库,单一数据表的…

Golang中互斥锁和读写互斥锁

目录 互斥锁 使用互斥锁的示例代码 读写互斥锁 读写互斥锁的示例代码 互斥锁 在Golang中,互斥锁(Mutex)是一种基本的同步原语,用于实现对共享资源的互斥访问。互斥锁通过在代码中标记临界区来控制对共享资源的访问&#xff0c…

LC-3机器码编程实验 求成绩等级

一、实验目的 分析和理解指定的需解决问题。利用LC-3的汇编代码设计实现相关程序。通过LC-3仿真器调试和运行相关程序并得到正确的结果。 二、实验内容 对学生的成绩使用数组进行排序。 背景:一位老师需要你帮忙决定学生的成绩,她想要根据学生分数在…