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("文件写入成功");
            }
        } );
    }
});

 

posted @ 2021-11-17 11:07  程序杨%  阅读(507)  评论(0编辑  收藏  举报