前面我们已经学习了如何使用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("程序执行完毕");