異步文件寫入&&流式文件的寫入&&文件的讀取&&fs模塊的其他方法

一、異步文件的寫入

1、引入fs模塊

2、打開文件

fs.open(path ,flags [ , mode] ,callback)
異步調(diào)用的方法,結(jié)果都是通過回調(diào)函數(shù)的參數(shù)返回的
回調(diào)函數(shù)有兩個參數(shù)

  • err 錯誤對象,如果沒有錯誤則為null
  • fd 文件的描述符
    fs.write(fd,string [,postion [,encoding ] ],callback)
  • 用來異步寫入一個文件
var  fs = require ("fs")
//回調(diào)函數(shù)必須傳
fs.open("hello2.txt" , "w" , function(err,fd){
//判斷是否出錯
if(!err){
fs.write(fd,"這是寫入的內(nèi)容",function(err){
if(!err){
console.log("寫入成功")}
})
})else{
console.log(err)
}

二、簡單文件寫入

1、fs.writeFile(file,data [ ,options],callback)

2、fs.writeFileSync(file,data[,options])

  • file 要操作的文件路徑
  • data 要寫入的數(shù)據(jù)
  • options 選項,可以對寫入進行一些設置??蓚骺刹粋?/li>
  • callback 當寫入完成以后執(zhí)行的函數(shù)
  • flag
    r:只讀
    w:可寫
    a:追加
//引入fs模塊
var fs=require("fs")
// r:讀?。ㄎ募淮嬖冢霈F(xiàn)異常) r+:讀寫 w:寫(如果不存在,則創(chuàng)建) a:追加 
fs.writeFile("hello3.txt","這事通過writeFile寫入的內(nèi)容",{flag:"w"},function(err){
    if (!err) {
        console.log("寫入成功");
    }
})

三、流式文件寫入

同步、異步、簡單的文件寫入都不適合大文件的寫入。因為性能較差,容易導致內(nèi)存溢出。

1、創(chuàng)建一個可寫流

fs.createWriteStream(path,[,opyions])

  • path:文件路徑。
  • options:配置的參數(shù)??梢允÷圆粚憽?/li>
//引入fs模塊
var fs=require("fs")
fs.createWriteStream(path,[,opyions])
var ws=fs.createWriteStream("hello3.txt")
// 可以通過監(jiān)聽流的open和close事件來監(jiān)聽流的打開和關(guān)閉
// on和once都可以綁定事件。
// on(事件字符串,回調(diào)函數(shù)) 可以為對象綁定一個事件。
// once(事件字符串,回調(diào)函數(shù)) 可以為對象綁定一個一次性的事件。該事件將會在觸發(fā)一次以后自動失效。
ws.once("open",function () {
    console.log("流打開了~~~");   
})
ws.once("close",function () {
    console.log("流關(guān)閉了~~~");   
})

// 通過ws向文件中輸出內(nèi)容。只要流存在,可以分多次把同一個內(nèi)容寫進去。
ws.write("通過可寫流寫入的內(nèi)容")
// 關(guān)閉流
// ws.close() //當寫入多個的時候,文件內(nèi)只會存在第一個 就直接關(guān)閉了。所以我們一般不使用。
// 結(jié)束
ws.end() //會等到文件內(nèi)容所有寫入結(jié)束之后才關(guān)閉。

2、ws.write("通過可寫流寫入的內(nèi)容")

可以持續(xù)的往文件內(nèi)寫入內(nèi)容。

3、關(guān)閉:ws.end()

四、文件的讀取

1、簡單文件讀取

fs.readFile(path[,options],callback)
fs.readFileSync(path[,options])

  • path:要讀取的文件的路徑。
  • options:讀取的選項。
  • callback:回調(diào)函數(shù)。通過回調(diào)函數(shù)將我們讀取到的內(nèi)容返回。
    err:異常對象。
    data:讀取到的數(shù)據(jù),會返回一個buffer
var fs = require("fs")
fs.readFile("hello3.txt", function (err, data) {
    if (!err) {
        // 由于返回的是buffer,所以要想讀取出來需要轉(zhuǎn)一下。
        console.log(data.toString());
    }
})

2、流式文件的讀取

流式文件讀取也適用于一些比較大的文件,可以分多次將文件讀取到內(nèi)存中。
可讀流

(1)、創(chuàng)建一個可讀流

var rs=fs.createReadStream("an.jpg");

(2)、監(jiān)聽流的開始和關(guān)閉
(3)、綁定一個data事件。

如果要讀取一個可讀流中的數(shù)據(jù),必須要為可讀流綁定一個data事件。data事件綁定完畢,它會自動開始讀取數(shù)據(jù)。

var fs = require("fs")
// 創(chuàng)建一個可讀流
var rs=fs.createReadStream("an.jpg");

// 監(jiān)聽流的開啟和關(guān)閉
rs.once("open",function () {
    console.log("可讀流打開了");
})
rs.once("close",function () {
    console.log("可讀流關(guān)閉了");
})
// 如果要讀取一個可讀流中的數(shù)據(jù),必須要為可讀流綁定一個data事件。data事件綁定完畢,它會自動開始讀取數(shù)據(jù)。
rs.on("data",function(data){
    // datd:形參,接收讀取到的數(shù)據(jù)
    console.log(data);
})

可寫流

(1)、創(chuàng)建一個可讀流

var ws=fs.createWriteStream("an.mp3");

(2)、監(jiān)聽流的開始和關(guān)閉
(3)、綁定一個data事件。

也可以用pipe()直接寫入

var fs = require("fs")
// 創(chuàng)建一個可讀流
var rs=fs.createReadStream("an.jpg");
// 創(chuàng)建一個可寫流
var ws=fs.createWriteStream("an.mp3");
// 監(jiān)聽流的開啟和關(guān)閉
rs.once("open",function () {
    console.log("可讀流打開了");
})
rs.once("close",function () {
    console.log("可讀流關(guān)閉了");
    // 數(shù)據(jù)讀取完畢,關(guān)閉可寫流
    ws.end()
})
ws.once("open",function () {
    console.log("可寫流打開了");
})
ws.once("close",function () {
    console.log("可寫流關(guān)閉了");
})
// 如果要讀取一個可讀流中的數(shù)據(jù),必須要為可讀流綁定一個data事件。data事件綁定完畢,它會自動開始讀取數(shù)據(jù)。
rs.on("data",function(data){
    // datd:形參,接收讀取到的數(shù)據(jù)
    console.log(data);
    ws.write(data)
    
})
// pipe():將可讀流中的內(nèi)容直接輸出到可寫流中
rs.pipe(ws)

五、fs模塊的其他方法

  • fs.existsSync(path):檢查一個文件是否存在
// 檢擦一個文件是否存在
var isexistsSync = fs.existsSync("a.mp3")

console.log(isexistsSync);
  • fs.stat(path,callback):獲取文件的狀態(tài)(異步)
  • fs.statSync(path):獲取文件的狀態(tài)(同步)
// 獲取文件的狀態(tài)
// 會返回一個對象。這個對象中保存了當前對象狀態(tài)的相關(guān)信息(arguments)
fs.stat("a.mp3", function (err, stat) {
    // 1、size:文件的大小。2、isFile():是否是一個文件。3、isDirectory():是否是一個文件夾(目錄)
    console.log(stat);
    console.log(stat.isDirectory());
})
fs.statSync(path)
  • fs.unlink(path,callback):刪除文件(異步)
  • fs.unlinkSync(path):刪除文件(同步)
// 刪除文件
fs.unlink(path, callback)
fs.unlinkSync(path)

fs.unlinkSync("hello.txt") // 同步刪除
  • fs.readdir(path[,options],callback):讀取一個目錄的目錄結(jié)構(gòu)(異步)
  • fs.readdirSync(path[,options]):讀取一個目錄的目錄結(jié)構(gòu)(同步)
// 讀取一個目錄的目錄結(jié)構(gòu)。
fs.readdir(path[, options], callback)
// files:是一個字符串數(shù)組,每一個元素就是一個文件夾或文件的名字。
fs.readdir(".", function (err, files) {
    if (!err) {
        console.log(files);
    }
})
fs.readdirSync(path [, options])
  • fs.truncate(path,len,callback):截斷文件(異步)
  • fs.truncateSync(path,len):截斷文件(同步)
// 截斷文件,將文件修改為指定的大小
fs.truncate(path,len,callback)
fs.truncateSync(path,len)

fs.truncateSync("hello2.txt",2)
  • fs.mkdir(path[,mode],callback):創(chuàng)建一個目錄(異步)
  • fs.mkdirSync(path[,mode]):創(chuàng)建一個目錄(同步)
// 創(chuàng)建一個目錄
fs.mkdir(path[,mode],callback)
fs.mkdirSync(path[,mode])

fs.mkdirSync("hello")
  • fs.rmdir(path,callback):刪除一個目錄(異步)
  • fs.rmdirSync(path):刪除一個目錄(同步)
// 刪除一個目錄
fs.rmdir(path,callback)
fs.rmdirSync(path)

fs.rmdirSync("hello")
  • fs.rename(oldPath,newPath,callback): 重命名文件和目錄(異步)
  • fs.renameSync(oldPath,newPath): 重命名文件和目錄(同步)
// 重命名文件和目錄.
fs.rename(oldPath,newPath,callback)
// 1、oldPath:舊的路徑。2、newPath:新的路徑。
fs.rename("a.mp3","xin.mp3",function(err){
    if (!err) {
        console.log("修改");
    }
})
fs.renameSync(oldPath,newPath)
  • fs.watchFile(filename[,options],listener):監(jiān)視文件的修改
// 監(jiān)視文件的修改
fs.watchFile(filename[,options],listener)
// 1、filename:要監(jiān)視的文件的名字。2、options:配置選項。3、listener:回調(diào)函數(shù),當文件發(fā)生變化時,回調(diào)函數(shù)會執(zhí)行
fs.watchFile("hello2.txt",{interval:3000},function(curr,prev){
    // 1.curr:當前文件的狀態(tài)。2.prev:修改前文件的對象。這兩個都是stats對象
console.log('文件發(fā)生變化');
console.log("修改前文件的大?。?+prev.size);
console.log("修改后文件的大?。?+curr.size);
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容