资讯专栏INFORMATION COLUMN

Node.js学习之路08——fs文件系统之stream流的基本介绍

BoYang / 937人阅读

摘要:中各种用于读取数据的对象对象描述用于读取文件代表客户端请求或服务器端响应代表一个端口对象用于创建子进程的标准输出流。如果子进程和父进程共享输入输出流,则子进程的标准输出流被废弃用于创建子进程的标准错误输出流。

9. stream

fs模块中集中文件读写方法的区别

用途 使用异步方式 使用同步方式
将文件完整读入缓存区 readFile readFileSync
将文件部分读入缓存区 read readSync
将数据完整写入文件 writeFile writeFileSync
将缓存区中的部分内容写入文件 write writeSync
在使用readFile或者readFileSync读取文件内容时,Node.js首先将文件内容完整地读入缓存区,再从缓存区中读取文件内容。在使用writeFile或者writeFileSync方法写入文件内容时,Node.js首先将该文件内容读入缓存区,然后一次性将缓存区中内容写入到文件中。也就是说,在使用readFile或者readFileSync读取文件内容或者使用writeFile或者writeFileSync`写入文件内容时,Node.js会将该文件内容视为一个整体,为其分配缓存区并且一次性将文件内容读取到缓存区。在这期间,Node.js不再执行任何其他处理。

如果使用read或者readSync方法读取文件内容,Node.js将不断地将文件中一小块内容读入缓存区,最后从缓存区中读取文件内容,如果使用write或者writeSync写入文件内,Node.js将实行以下过程:1.将需要书写的数据书写到一个内容缓冲区;2. 待缓冲区写满后再讲该缓冲区中内容写入到文件中;3. 重复执行过程1和过程2,直到数据全部写入文件为止。也就是说,如果使用read或者readSync读取文件内容或者使用write或者writeSync写入文件,在读写文件过程中允许Node.js执行其他操作。

的概念

在一个应用程序中,流是一组有序的,有起点和终点的字节数据的传输手段。在应用程序中各种对象之间交换与传输数据的时候,总是先将对象中所包含的数据转换为各种形式的流数据(字节数据),再通过流的传输,到达目的对象后再将流数据转换为该对象中可以使用的数据。

在Node.js中,使用各种实现了stream.Readable接口的对象来讲对象数据读取为流数据,所有这些对象都是继承了EventEmitter类的实例对象,在读取数据的过程中,将可能触发各种事件。

在Node.js中,可以使用flowing模式与非flowing模式来读取数据,当使用flowing模式时,将使用操作系统的内部I/O机制来读取数据。这将允许你以最快的速度来读取数据。当使用非flowing模式时,必须显式调用对象的read方法来读取数据。

Node.js中各种用于读取数据的对象

对象 描述
fs.ReadStream 用于读取文件
http.IncomingMessage 代表客户端请求或服务器端响应
net.Socket 代表一个socket端口对象
child.stdout 用于创建子进程的标准输出流。如果子进程和父进程共享输入输出流,则子进程的标准输出流被废弃
child.stderr 用于创建子进程的标准错误输出流。如果子进程和父进程共享输入输出流,则子进程的标准错误输出流被废弃
process.stdin 用于创建进程的标准输入流
Gzip,Deflate,DeflatRaw 用于实现数据压缩
9.1 使用ReadStream对象读取文件

fs.createReadStream(path, [options])

options参数

flags: "r",//default,

encoding: "utf8", //base64, ascii, null(default),

autoClose: true(default), //false

start: 使用整数值来指定文件的开始读取位置

end: 使用整数值来指定文件的结束读取位置

const fs = require("fs");
let filename = "./one.js"
let file = fs.createReadStream(filename, {
    start: 0,
    end: 100,
    encoding: "utf8"
});

file.on("open", (fd) => {
    console.log("open file and start read this file stream..");
});

file.pause(); // 暂停读取文件流

file.on("data", (data) => {
    console.log(`读取到文件内容, ${data}`);
});

file.resume(); // 恢复读取文件流

file.on("end", () => {
    console.log("文件读取结束");
});

file.on("close", () => {
    console.log("文件关闭");
});

file.on("error", (err) => {
    console.log(`文件读取错误, ${err}`);
});
/***
 * open file and start read this file stream..
 * 读取到文件内容, hello
 * 文件读取结束
 * 文件关闭
 */
9.2 使用WriteStream对象写入文件

fs.createWriteStream(path, [options])

const fs = require("fs");
let readFilename = "./readFilename.js";
let writeFileName = "./writeFileName.js";
let readFile = fs.createReadStream(readFilename, {
    start: 0,
    end: 100,
    encoding: "utf8"
});
let writeFile = fs.createWriteStream(writeFileName);
readFile.on("data", (data) => {
    writeFile.write(data, () => {
        console.log("write writeFileName.js");
        console.log(data);
    })
});

readFile.on("open", (fd) => {
    console.log(`open readFilename.js`);
});

readFile.on("end", () => {
    writeFile.end("byebye", () => {
        console.log("writeFile.js end");
        console.log(`${writeFile.bytesWritten}`)
    });
});
/***
 * open readFilename.js
 * write writeFileName.js
 * console.log("this is readFilename.js");
 * writeFile.js end
 * 45 
 */

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92873.html

相关文章

  • [转]nodejs Stream使用手册

    摘要:方法也可以接收一个参数表示数据请求着请求的数据大小,但是可读流可以根据需要忽略这个参数。读取数据大部分情况下我们只要简单的使用方法将可读流的数据重定向到另外形式的流,但是在某些情况下也许直接从可读流中读取数据更有用。 介绍本文介绍了使用 node.js streams 开发程序的基本方法。 We should have some ways of connecting programs ...

    luffyZh 评论0 收藏0
  • [译]关于Node.js streams你需要知道的一切

    摘要:当一个客户端的响应对象是一个可读流,那么在服务器端这就是一个可写流。的模块给我们提供了一个可以操作任何文件的可读流通过方法创建。创建一个可读流创建可读流,我们需要类创建一个可读流非常简单。可以通过修改可读流配置里面的方法实现。 Node.js的stream模块是有名的应用困难,更别说理解了。那现在可以告诉你,这些都不是问题了。 多年来,开发人员在那里创建了大量的软件包,其唯一目的就是使...

    bang590 评论0 收藏0
  • 认识node核心模块--从Buffer、Streamfs

    摘要:端输入数据到端,对就是输入流,得到的对象就是可读流对就是输出端得到的对象是可写流。在中,这四种流都是的实例,它们都有事件,可读流具有监听数据到来的事件等,可写流则具有监听数据已传给低层系统的事件等,和都同时实现了和的事件和接口。 原文地址在我的博客 node中的Buffer和Stream会给刚接触Node的前端工程师们带来困惑,原因是前端并没有类似概念(or 有我们也没意识到)。然而,...

    TANKING 评论0 收藏0
  • 浅谈node.js中的stream(流)

    摘要:在可读流事件里我们就必须调用方法。当一个对象就意味着我们想发出信号这个流没有更多数据了自定义可写流为了实现可写流,我们需要使用流模块中的构造函数。我们只需给构造函数传递一些选项并创建一个对象。 前言 什么是流呢?看字面意思,我们可能会想起生活中的水流,电流。但是流不是水也不是电,它只是描述水和电的流动;所以说流是抽象的。在node.js中流是一个抽象接口,它不关心文件内容,只关注是否从...

    elliott_hu 评论0 收藏0
  • 前端每周清单半年盘点 Node.js

    摘要:前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点分为新闻热点开发教程工程实践深度阅读开源项目巅峰人生等栏目。对该漏洞的综合评级为高危。目前,相关利用方式已经在互联网上公开,近期出现攻击尝试爆发的可能。 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢...

    kid143 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<