05小白學nodejs 檔案讀取

junwind發表於2021-05-25

簡單檔案讀取:

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);
本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風

相關文章