首先必須先要了解Buffer,Buffer是js和c++的結合體,類數組,通常與Stream一起用:
(1).Buffer是個類,因此可以構建成對象
(2).buf具有數組的性質
字符串轉換成二進制:
(1)通常用Buffer來構建二進制
new Buffer(string,[encodding]) 默認是utf-8 //中文一個字是3個字節(jié)
buf對象之間的encodding相互轉換
buf.write(string,[encodding])
(2)buf轉為字符串
buf.toString([encodding])
buf += chunk //這是一種默認的轉換,會將二進制轉為字符串,默認是utf-8
因為buf在轉換成string時,中文是3個字節(jié),如果不是寬字節(jié)編碼時,就會截斷一部分buf,造成亂碼
(3)buffer的拼接(buffer的應用中一般是一段一段的傳輸的),一般用在兩種情況下
(1) var rs = fs.createReadStream()
rs的data事件,是一段一段讀的
rs.on('data',function(chunk){})
(2)網絡請求中,res.on('data',function(chunk){}
拼接中用:
var rs = fs.createReadStream('./test.txt');
var chunks = [];
rs.on('data', function (chunk) {
chunks.push(chunk);
});
rs.on('end', function () {
var buf = Buffer.concat(chunks);
var str = buf.toString()
});
(4)對文件讀取時以及網絡請求的優(yōu)化
(1)網絡中優(yōu)化
node可以將靜態(tài)的文件轉換成二進制的內容,將二進制的內容返回,可將性能大幅度提高.
同時將二進制采用zlib進行壓縮
(2)文件讀取的優(yōu)化
fs.readFile與fs.createReadStream的區(qū)別:
fs.readFile是一次將讀取的內容存到內存中
fs.createReadStream是從磁盤中讀一點,放到內存中,先在內存中準備一段Buffer,然后調用fs.read()讀取時逐步復制到Buffer中.因此調用fs.read()則調用一次磁盤讀取.
fs.createReadStream(path,opts) 其中:highWaterMark設置為64*1024這樣可保證速度
// 創(chuàng)建一個可讀流
var readerStream = fs.createReadStream('input.txt');
// 創(chuàng)建一個可寫流
var writerStream = fs.createWriteStream('output.txt');
// 管道讀寫操作
// 讀取 input.txt 文件內容,并將內容寫入到 output.txt 文件中
readerStream.pipe(writerStream);