17 node基础——流式文件写入,读取
问一:为什么有了异步文件写入,同步文件写入,和简单文件写入(同步或者是异步),还需要有流式文件写入?
上传的写入文件的方式,都是1次性把文件的内容全部写入,如果文件过大,则存在以下问题:
- 写入速度慢
- 可能导致内存溢出
所有以上写入文件的大小都是小文件;所有需要用流式文件写入
问二,流式文件写入步骤
1.创建一个可写流
fs.createWriteStream(path[, options])
- 可以用来创建一个可写流
- path,文件路径
- options 配置的参数
2.通过ws向文件中输出内容
ws.write("通过可写流写入文件的内容1");
ws.write("通过可写流写入文件的内容2");
3.关闭流:
ws.end();
补充:用什么函数来监听,流的状态是关闭的还是打开的
//用于监督流的打开状态
on(事件字符串,回调函数)
- 可以为对象绑定一个事件
once(事件字符串,回调函数)
- 可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效
once也可以换成on但是on用来监督一直存在的事件,因为流只需打开1次,所有用once用来监听1次性的事件更高效
ws.once("open",function () {
console.log("流打开了~~~");
});
//用于监督流的关闭状态,如果流关闭了,则回出发,这个事件
ws.once("close",function () {
console.log("流关闭了~~~");
});
举列子:
//创建可用流 var ws = fs.createWriteStream("hello3.txt"); //2通过ws向文件中输出内容 ws.write("通过可写流写入文件的内容"); ws.write("今天天气真不错"); ws.write("锄禾日当午"); ws.write("红掌拨清清"); ws.write("清清真漂亮"); //3关闭流 ws.end();
问三:流式文件的读取:适用于大文件,可以分多次读取到内存中
复杂写法:
/* 流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中 */ var fs = require("fs"); //1.创建一个可读流 var rs = fs.createReadStream("C:/Users/lilichao/Desktop/笔记.mp3"); //2.创建一个可写流 var ws = fs.createWriteStream("a.mp3"); //监听流的开启和关闭 rs.once("open",function () { console.log("可读流打开了~~"); }); rs.once("close",function () { console.log("可读流关闭了~~"); //4.数据读取完毕,关闭可写流 ws.end(); }); ws.once("open",function () { console.log("可写流打开了~~"); }); ws.once("close",function () { console.log("可写流关闭了~~"); }); //3.如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据 rs.on("data", function (data) { //console.log(data); //3.1data,就是读取到的数据,将读取到的数据写入到可写流中 ws.write(data); });
优化的写法:
var fs = require("fs"); //创建一个可读流 var rs = fs.createReadStream("C:/Users/lilichao/Desktop/笔记.mp3"); //创建一个可写流 var ws = fs.createWriteStream("b.mp3");//在你的项目相对的路径下就存在了一个,b.mp3文件 //pipe()可以将可读流中的内容,直接输出到可写流中 rs.pipe(ws);
问四:简单文件读取:但是这种读取不适合大文件
var fs = require("fs"); fs.readFile("an.jpg" , function (err , data) { if(!err){ //console.log(data); //输出的是一个buffer,因为buffer里面可以存任何形式的文件,mp3,mp4,txt等 //将data写入到文件中 fs.writeFile("C:/Users/lilichao/Desktop/hello.jpg",data,function(err){ if(!err){ console.log("文件写入成功"); } } ); } });