緩沖區(qū)
當瀏覽器向服務器請求數(shù)據(jù)后掘譬,數(shù)據(jù)先被加載到buffer中,再被瀏覽器讀扰澜ⅰ们陆;瀏覽器向服務器上傳數(shù)據(jù)寒瓦,也是先加載到buffer中情屹,再給服務器。buffer是一個用于過度的中間地帶
buffer的結(jié)構(gòu)和數(shù)組很像杂腰,操作的方法也和數(shù)組類似
數(shù)組不能存儲二進制文件垃你,buffer專門用于存儲二進制數(shù)據(jù)
-
使用buffer不需要引入模塊
var str = "哈庫那馬塔塔" //將str保存到buffer中 var buf = Buffer.from(str) console.log(buf) //此處會打印出str的二進制格式,但是是以十六進制去顯示 console.log(buf.toString()) //調(diào)用toString方法喂很,轉(zhuǎn)化為字符串
-
可以創(chuàng)建一個指定大小的buffer
var buf2 = new Buffer(1024) //指定大小為1024byte惜颇,即1kb,但是最好別用這個方法 var buf = Buffer.alloc(1024) //直接使用這種方法創(chuàng)建1kb的buffer
-
可以通過索引少辣,去操作buffer中的元素
buf2[0] = 0 buf2[1] = 255
buffer的大小一旦確定凌摄,便不能修改,因為buffer操作實際上是對底層的內(nèi)存的直接操作
文件系統(tǒng)(fs)
node中用于操作系統(tǒng)中文件的模塊漓帅。在node中锨亏,與文件系統(tǒng)的交互是非常重要的,服務器的本質(zhì)就是將本地的文件發(fā)送給遠程的客戶端
fs模塊提供了打開忙干、讀取器予、寫入文件,以及與文件交互等API
-
使用fs模塊需要對其先進行加載捐迫,直接引入乾翔,不需要下載
const fs = require("fs")
-
fs模塊中所有的操作都可以選擇是同步的還是異步的
- 同步文件系統(tǒng)有可能會阻塞程序的正常執(zhí)行,因為除非操作完畢施戴,否則代碼就會卡在那里
- 異步文件系統(tǒng)不會阻塞成語的執(zhí)行反浓,在操作完成后,通過回調(diào)函數(shù)將結(jié)果返回
文件寫入
文件的寫入一般分為三步:
1. 打開文件
2. 向文件中寫入內(nèi)容
3. 保存赞哗,關閉文件
同步的文件寫入
-
打開文件
var fd = fs.openSync(path, flags[, mode])
-
path
:要打開的文件路徑 -
flags
:打開文件要做的操作的類型雷则,和C語言類似 - 此方法會返回一個文件的描述符作為結(jié)果,可以通過該描述符對文件進行操作
-
-
寫入內(nèi)容
fs.writeSync(fd, string[, position[, encoding]])
-
fd
:需要寫入的文件的描述符 -
string
:要寫入的內(nèi)容
-
-
關閉文件
fs.closeSync(fd)
異步的文件寫入
-
打開文件
fs.open(path, flags[, mode], callback)
callback
:回調(diào)函數(shù)-
異步的
open
返回值為undefined懈玻,異步的結(jié)果都是通過回調(diào)函數(shù)的參數(shù)進行返回的fs.open("hello.txt", "r", function(err, fd){ if(!err){ console.log(fd) }else{ console.log(err) } })
- 回調(diào)函數(shù)有兩個參數(shù)
-
err
:錯誤對象巧婶,如果沒有錯誤則為null - 描述符
-
- 回調(diào)函數(shù)有兩個參數(shù)
-
寫入內(nèi)容
fs.write(fd, string[, position[, encoding]], callback)
-
異步寫入的寫入操作不能在全局執(zhí)行乾颁,因為讀取文件已經(jīng)是異步的了。要寫在打開文件成功的循環(huán)內(nèi)
fs.open("hello.txt", "r", function(err, fd){ if(!err){ //沒有出錯艺栈,進行寫入 fs.write(fd, "異步寫入", function(err){ if(!err){ console.log("寫入成功") } }) }else{ console.log(err) } })
-
-
關閉文件英岭,異步的關閉也要在循環(huán)內(nèi)寫,不能寫在全局
fs.open("hello.txt", "r", function(err, fd){ if(!err){ //沒有出錯湿右,進行寫入 fs.write(fd, "異步寫入", function(err){ if(!err){ console.log("寫入成功") } //關閉文件 fs.close(fd, function(err){ if(!err){ console.log("關閉成功") } }) }) }else{ console.log(err) } })
簡單文件寫入
實際開發(fā)中诅妹,純粹的同步寫入和西部寫入要么寫起來很麻煩,要么可能會出現(xiàn)程序阻塞毅人。下面是簡單寫入方法吭狡,也分成同步和異步,是node提供的一個語法糖
-
異步的簡單文件寫入
fs.writeFile(file, data[, options], callback)
-
file
:要操作的文件路徑 -
data
:要寫入的數(shù)據(jù)
var fs = require("fs") fs.writeFile("hello.txt", "簡單文件寫入的內(nèi)容", function(err){ if(!err){ console.log("簡單寫入成功") } }) n
-
-
同步的簡單文件寫入
fs.writeFileSync(file, data[, options])
流式文件寫入
上面提到的文件寫入的方式丈莺,都是一次性的將要寫入的內(nèi)容直接保存到文件中划煮,意味著當進行寫入之前,要將所有要寫入的內(nèi)容準備好缔俄,那么如果文件太大的話弛秋,將會非常的占用內(nèi)存
流式文件寫入就是一種給大文件寫入的解決方案,是一種持續(xù)寫入的方案
-
創(chuàng)建可寫流
fs.createWriteStream(path[, options])
var ws = fs.createWriteStream("hello.txt")
-
通過可寫流寫入文件
ws.write("通過可寫流進行寫入")
-
可以通過監(jiān)聽流的open和close事件來監(jiān)聽流是否被打開
ws.once("open", function(){ console.log("流打開了") })
-
-
關閉流
ws.end()
簡單文件讀取
也分成異步和同步
-
異步的
fs.readFile("htllo.txt", function(err, data){ if(!err){ console.log(data.toString()) }else{ ... } })
流式文件讀取
適用于大文件的讀取俐载,可以分多次將文件讀取到內(nèi)存中
-
創(chuàng)建可讀流
var rs = fs.createReadStream("hello.txt")
-
監(jiān)聽流
rs.once("open", function(){ console.log("可讀流打開") }) rs.once("close", function(){ console.log("可讀流關閉") })
-
讀取可讀流的數(shù)據(jù)蟹略,要為可讀流綁定一個data事件。當data綁定完畢遏佣,會自動開始讀取數(shù)據(jù)挖炬,數(shù)據(jù)通過data返回
rs.on("data", function(data){ console.log(data) })
pipe()
方法
可以直接將可讀流中的內(nèi)容直接輸出到可寫流
var rs = fs.createReadStream("hello.txt")
var ws = fs.createWriteStream("aaaa.txt")
rs.pipe(ws)