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

一庐镐、異步文件的寫入

1蒋譬、引入fs模塊

2储耐、打開文件

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

  • err 錯(cuò)誤對象刻撒,如果沒有錯(cuò)誤則為null
  • fd 文件的描述符
    fs.write(fd,string [耿导,postion [声怔,encoding ] ],callback)
  • 用來異步寫入一個(gè)文件
var  fs = require ("fs")
//回調(diào)函數(shù)必須傳
fs.open("hello2.txt" , "w" , function(err舱呻,fd){
//判斷是否出錯(cuò)
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 選項(xiàng),可以對寫入進(jìn)行一些設(shè)置熏瞄〗潘睿可傳可不傳
  • callback 當(dāng)寫入完成以后執(zhí)行的函數(shù)
  • flag
    r:只讀
    w:可寫
    a:追加
//引入fs模塊
var fs=require("fs")
// r:讀取(文件不存在强饮,出現(xiàn)異常) r+:讀寫 w:寫(如果不存在由桌,則創(chuàng)建) a:追加 
fs.writeFile("hello3.txt","這事通過writeFile寫入的內(nèi)容",{flag:"w"},function(err){
    if (!err) {
        console.log("寫入成功");
    }
})

三、流式文件寫入

同步、異步沥寥、簡單的文件寫入都不適合大文件的寫入碍舍。因?yàn)樾阅茌^差,容易導(dǎo)致內(nèi)存溢出邑雅。

1片橡、創(chuàng)建一個(gè)可寫流

fs.createWriteStream(path,[,opyions])

  • path:文件路徑。
  • options:配置的參數(shù)淮野∨跏椋可以省略不寫。
//引入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ù)) 可以為對象綁定一個(gè)事件。
// once(事件字符串洞难,回調(diào)函數(shù)) 可以為對象綁定一個(gè)一次性的事件舆吮。該事件將會在觸發(fā)一次以后自動失效。
ws.once("open",function () {
    console.log("流打開了~~~");   
})
ws.once("close",function () {
    console.log("流關(guān)閉了~~~");   
})

// 通過ws向文件中輸出內(nèi)容队贱。只要流存在色冀,可以分多次把同一個(gè)內(nèi)容寫進(jìn)去。
ws.write("通過可寫流寫入的內(nèi)容")
// 關(guān)閉流
// ws.close() //當(dāng)寫入多個(gè)的時(shí)候柱嫌,文件內(nèi)只會存在第一個(gè) 就直接關(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:讀取的選項(xiàng)蕾盯。
  • callback:回調(diào)函數(shù)。通過回調(diào)函數(shù)將我們讀取到的內(nèi)容返回蓝丙。
    err:異常對象级遭。
    data:讀取到的數(shù)據(jù),會返回一個(gè)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)建一個(gè)可讀流

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

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

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

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

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

可寫流

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

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

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

也可以用pipe()直接寫入

var fs = require("fs")
// 創(chuàng)建一個(gè)可讀流
var rs=fs.createReadStream("an.jpg");
// 創(chuàng)建一個(gè)可寫流
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)閉了");
})
// 如果要讀取一個(gè)可讀流中的數(shù)據(jù)伟骨,必須要為可讀流綁定一個(gè)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):檢查一個(gè)文件是否存在
// 檢擦一個(gè)文件是否存在
var isexistsSync = fs.existsSync("a.mp3")

console.log(isexistsSync);
  • fs.stat(path,callback):獲取文件的狀態(tài)(異步)
  • fs.statSync(path):獲取文件的狀態(tài)(同步)
// 獲取文件的狀態(tài)
// 會返回一個(gè)對象。這個(gè)對象中保存了當(dāng)前對象狀態(tài)的相關(guān)信息(arguments)
fs.stat("a.mp3", function (err, stat) {
    // 1稀并、size:文件的大小仅颇。2、isFile():是否是一個(gè)文件碘举。3忘瓦、isDirectory():是否是一個(gè)文件夾(目錄)
    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):讀取一個(gè)目錄的目錄結(jié)構(gòu)(異步)
  • fs.readdirSync(path[,options]):讀取一個(gè)目錄的目錄結(jié)構(gòu)(同步)
// 讀取一個(gè)目錄的目錄結(jié)構(gòu)。
fs.readdir(path[, options], callback)
// files:是一個(gè)字符串?dāng)?shù)組引颈,每一個(gè)元素就是一個(gè)文件夾或文件的名字耕皮。
fs.readdir(".", function (err, files) {
    if (!err) {
        console.log(files);
    }
})
fs.readdirSync(path [, options])
  • fs.truncate(path,len,callback):截?cái)辔募ó惒剑?/strong>
  • fs.truncateSync(path,len):截?cái)辔募ㄍ剑?/strong>
// 截?cái)辔募?將文件修改為指定的大小
fs.truncate(path,len,callback)
fs.truncateSync(path,len)

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

fs.mkdirSync("hello")
  • fs.rmdir(path,callback):刪除一個(gè)目錄(異步)
  • fs.rmdirSync(path):刪除一個(gè)目錄(同步)
// 刪除一個(gè)目錄
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:配置選項(xiàng)。3赐俗、listener:回調(diào)函數(shù)拉队,當(dāng)文件發(fā)生變化時(shí),回調(diào)函數(shù)會執(zhí)行
fs.watchFile("hello2.txt",{interval:3000},function(curr,prev){
    // 1.curr:當(dāng)前文件的狀態(tài)阻逮。2.prev:修改前文件的對象粱快。這兩個(gè)都是stats對象
console.log('文件發(fā)生變化');
console.log("修改前文件的大小:"+prev.size);
console.log("修改后文件的大卸嵯省:"+curr.size);
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皆尔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子币励,更是在濱河造成了極大的恐慌慷蠕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件食呻,死亡現(xiàn)場離奇詭異流炕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仅胞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門每辟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人干旧,你說我怎么就攤上這事渠欺。” “怎么了椎眯?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵挠将,是天一觀的道長。 經(jīng)常有香客問我编整,道長舔稀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任掌测,我火速辦了婚禮内贮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汞斧。我一直安慰自己夜郁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布断箫。 她就那樣靜靜地躺著拂酣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仲义。 梳的紋絲不亂的頭發(fā)上婶熬,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天剑勾,我揣著相機(jī)與錄音,去河邊找鬼赵颅。 笑死虽另,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饺谬。 我是一名探鬼主播捂刺,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼募寨!你這毒婦竟也來了族展?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拔鹰,失蹤者是張志新(化名)和其女友劉穎仪缸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體列肢,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恰画,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓷马。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴还。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梯捕,死狀恐怖雷激,靈堂內(nèi)的尸體忽然破棺而出惕鼓,到底是詐尸還是另有隱情潜叛,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布锉罐,位于F島的核電站昂儒,受9級特大地震影響辈末,放射性物質(zhì)發(fā)生泄漏晒喷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一访敌、第九天 我趴在偏房一處隱蔽的房頂上張望凉敲。 院中可真熱鬧,春花似錦寺旺、人聲如沸爷抓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蓝撇。三九已至,卻和暖如春陈莽,著一層夾襖步出監(jiān)牢的瞬間渤昌,已是汗流浹背虽抄。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留独柑,地道東北人迈窟。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像忌栅,于是被迫代替她去往敵國和親车酣。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容