05小白学nodejs 文件读取

JavaScript/前端
363
0
0
2022-04-18
标签   NodeJs

简单文件读取:

fs.readFile(path[, options], callback)
    path  要读取的文件的路径
    options  读取的选项 
    callback 通过回调函数将读取到的内容返回 (err , data)
        err  错误对象
        data  读取到的数据,返回的是一个buffer对象

为什么返回的是buffer?

  • 因为读取的内容不一定都是一个纯文本,可能还有图片,视频,音频
  • 如果直接返回字符串,直接乱码(解码乱了),不认识这种二进制的格式,编码无法正常识别
  • 因为这些资源文件都是二进制的,返回buffer,通用性更高;
var fs = require('fs');

var path = "C:/Users/xqw/Pictures/xqw/我的头像.jpg";
fs.readFile(path, function(err, data) {if(!err) {// console.log(data.toString());//将data写入到文件
        fs.writeFile("hello.jpg", data, function(err) {if(!err) {
                console.log("文件写入成功");}});}
});

流式文件读取

  • 简单文件读取,同样是一次性全部把文件数据读取到内存中,文件过大,会导致内存溢出;因此对于大文件,流式读取更适合,
  • 流式读是将一个大文件,切分为一个一个小的块chunk,依次读取到内存中
var fs = require('fs');

//创建一个可读流
var rs = fs.createReadStream("C:/Users/xqw/Pictures/xqw/我的头像.jpg");
//创建一个可写流
var ws = fs.createWriteStream("a.jpg");

//监听流的开启和关闭
rs.once("open", function(){
    console.log("可读流打开了");
});
rs.once("close", function(){
    console.log("可读流关闭了");
    ws.end();//数据读取完毕,关闭可写流
});
ws.once("open", function(){
    console.log("可写流打开了");
});
ws.once("close", function(){
    console.log("可写流关闭了");
});

//如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
rs.on("data", function(data) {// console.log(data);//console.log(data.length);//每次读取的字节数//将读取到的数据写入到可写流中
    ws.write(data);//读完了,自动关闭可读流
});

更简单的办法

var fs = require('fs');

//创建一个可读流
var rs = fs.createReadStream("C:/Users/xqw/Pictures/xqw/我的头像.jpg");
//创建一个可写流
var ws = fs.createWriteStream("b.jpg");

rs.once("open", function(){
    console.log("可读流打开了");
});
rs.once("close", function(){
    console.log("可读流关闭了");
});
ws.once("open", function(){
    console.log("可写流打开了");
});
ws.once("close", function(){
    console.log("可写流关闭了");
});
//pipe()  可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws);