前面我们已经学习了如何使用fs模块中的readFile方法、readFileSync方法读取文件中内容,及如何使用fs模块中的writeFile方法、writeFileSync方法向一个文件写入内容。

用readFile方法或readFileSync方法读取文件内容时,Node.js首将文件内容完整地读入缓存区,再从该缓存区中读取文件内容。在使用writeFile方法或writeFileSync方法写入文件内容时,Node.js首先将该文件内容完整地读人缓存区,然后一欠性将缓存区中内容写入到文件中。

无论是read和write都是把文件视为一个整体,也是说,NodeJs需要在内存中开辟与文件相等大小的空间,如果文件小,这的确没有问题,但是如果是一个非常大的(10G)文件会怎样?内存根本装不下。

1.Stream流介绍

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

流分为输入流与输出流

2.  Stream流读取

fs = require('fs');

var dataContent = ''; //存储每次读取的数据
// 设置编码为 utf8。 //创建输入流
var readerStream = fs.createReadStream("./a.txt",new Buffer(20));
readerStream.setEncoding('UTF8');
//注册读取数据的事件
readerStream.on("data",function(content){
dataContent+=content;
console.log(dataContent);
}); readerStream.on("err",function(err){
console.error("出现err",err);
})
//读取数据完毕的事件
readerStream.on("end",function(){
console.log("读取完毕");
console.log(dataContent);
})

 3.stream写入流

 

var fs = require("fs");

var data = '源代码教育';

// 创建一个可以写入的流,写入到文件 my.txt 中

var writerStream = fs.createWriteStream('my.txt');

// 使用 utf8 编码写入数据

writerStream.write(data,'UTF8');

// 标记文件末尾

writerStream.end();

// 处理流事件 --> data, end, and error

writerStream.on('finish', function() {

console.log("写入完成。");

});

writerStream.on('error', function(err){

console.log(err.stack);

});

console.log("程序执行完毕");

常用方法备注:

/*
* 流,在应用程序中表示一组有序的、有起点有终点的字节数据的传输手段;
* Node.js中实现了stream.Readable/stream.Writeable接口的对象进行流数据读写;以上接口都继承自EventEmitter类,因此在读/写流不同状态时,触发不同事件;
* 关于流读取:Node.js不断将文件一小块内容读入缓冲区,再从缓冲区中读取内容;
* 关于流写入:Node.js不断将流数据写入内在缓冲区,待缓冲区满后再将缓冲区写入到文件中;重复上面操作直到要写入内容写写完;
* readFile、read、writeFile、write都是将整个文件放入内存而再操作,而则是文件一部分数据一部分数据操作;
*
* -----------------------流读取-------------------------------------
* 读取数据对象:
* fs.ReadStream 读取文件
* http.IncomingMessage 客户端请求或服务器端响应
* net.Socket Socket端口对象
* child.stdout 子进程标准输出
* child.stdin 子进程标准入
* process.stdin 用于创建进程标准输入流
* Gzip、Deflate、DeflateRaw 数据压缩
*
* 触发事件:
* readable 数据可读时
* data 数据读取后
* end 数据读取完成时
* error 数据读取错误时
* close 关闭流对象时
*
* 读取数据的对象操作方法:
* read 读取数据方法
* setEncoding 设置读取数据的编
* pause 通知对象众目停止触发data事件
* resume 通知对象恢复触发data事件
* pipe 设置数据通道,将读入流数据接入写入流;
* unpipe 取消通道
* unshift 当流数据绑定一个解析器时,此方法取消解析器
*
* ------------------------流写入-------------------------------------
* 写数据对象:
* fs.WriteStream 写入文件对象
* http.clientRequest 写入HTTP客户端请求数据
* http.ServerResponse 写入HTTP服务器端响应数据
* net.Socket 读写TCP流或UNIX流,需要connection事件传递给用户
* child.stdout 子进程标准输出
* child.stdin 子进程标准入
* Gzip、Deflate、DeflateRaw 数据压缩
*
* 写入数据触发事件:
* drain 当write方法返回false时,表示缓存区中已经输出到目标对象中,可以继续写入数据到缓存区
* finish 当end方法调用,全部数据写入完成
* pipe 当用于读取数据的对象的pipe方法被调用时
* unpipe 当unpipe方法被调用
* error 当发生错误
*
* 写入数据方法:
* write 用于写入数据
* end 结束写入,之后再写入会报错;

  

【09】node 之 fs流读写的更多相关文章

  1. node.js fs.open 和 fs.write 读取文件和改写文件

    Node.js的文件系统的Api //公共引用 var fs = require('fs'), path = require('path'); 1.读取文件readFile函数 //readFile( ...

  2. 【node】fs模块,文件和目录的操作

    检查文件是否存在,查询文件信息 fs.stat() fs.stat('./server.js', function (err, stat) { if (stat && stat.isF ...

  3. 9、Node.js Stream(流)

    #########################################################################介绍Node.js Stream(流)Stream 是 ...

  4. node中fs内置模块

    Node.js内置的fs模块就是文件系统模块,负责读写文件. 和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法. 回顾一下什么是异步方法.因为JavaScript的单线程 ...

  5. [Nodejs] node的fs模块

    fs 模块 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作 API. Node 导入文件系统模块(fs).Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如 ...

  6. 从官网学习Node.js FS模块方法速查

    最新文档请查看仓库 https://github.com/wangduandu... 1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参 ...

  7. 【基础巩固】文件流读写、大文件移动 FileStream StreamWriter File Path Directory/ ,m资料管理器(递归)

    C#获取文件名 扩展名 string fullPath = @"d:\test\default.avi"; string filename = Path.GetFileName(f ...

  8. Node.js FS模块方法速查

    1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参数是回调函数.回调函数的第一个参数往往是错误对象,如果没有发生参数,那么第一个参数可能 ...

  9. 手写node可读流之流动模式

    node的可读流基于事件 可读流之流动模式,这种流动模式会有一个"开关",每次当"开关"开启的时候,流动模式起作用,如果将这个"开关"设置成 ...

随机推荐

  1. question 002: dev c++ 当中如何调整字体大小?How to get the first program with C++? c++属于什么软件?

    方法:按住ctrl+鼠标滑轮滚动 c++属于系统软件还是应用软件? 说哪个都不对,编译之前属于应用软件,after compile ,it belongs to system software. #i ...

  2. Xcode Warning: “no rule to process file

    警告⚠️: warning: no rule to process file '/Users/Kingdev/Desktop/Git/finance_iOS/finance/Library/MBpro ...

  3. 51nod——2478 小b接水(预处理 思维)

    我本来想把每个谷都处理了,想了下觉得不好办.后来看其他人写的是处理每个位置,把每个位置可以接的水累加起来.整挺好. #include <bits/stdc++.h> using names ...

  4. (80)zabbix性能优化中的几个建议

    随着zabbix的广泛应用,少数人的zabbix服务器在性能上出现瓶颈,或者在未来会出现性能方面的瓶颈,接下来讨论几个有效并且简单的优化方案. 服务器硬件 想通过几个简单的配置让服务器提高成倍的性能, ...

  5. Git笔记(流水账)

    命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况: 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修 ...

  6. 【PHP】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI、SCRIPT_NAME、PHP_SELF区别

    实例:1.http://localhost/index.php/Home/Home/index.html $_SERVER['QUERY_STRING'] = ""; $_SERV ...

  7. HDwiki 源代码 - 互动百科开源

    昨日3.15,在曝光的企业中出现了一家让我好奇的企业(互动百科),一直不敢想百科能独立出来做成一家公司.出于对网站的好奇,今日进入该网站,惊讶的是此公司已经上市(股票代码:835799),在网站的底部 ...

  8. Codeforces Round #459 (Div. 2):B. Radio Station

    B. Radio Station time limit per test2 seconds memory limit per test256 megabytes Problem Dsecription ...

  9. Network of Schools POJ - 1236 (强联通)

    一些学校连接到了一个计算机网络.网络中的学校间有如下约定:每个学校维护一个列表,当该学校收到软件或信息后将会转发给列表中的所有学校(也就是接收方列表).需要注意的是如果B学校在A学校的接收方列表中,A ...

  10. COGS:313. [POI2001] 和平委员会

    313. [POI2001] 和平委员会 ★★☆   输入文件:spo.in   输出文件:spo.out   评测插件时间限制:1 s   内存限制:128 MB 题目描述 根据宪法,Bytelan ...