原文鏈接:https://www.runoob.com/nodejs/nodejs-stream.html
Package.json 屬性說明
name - 包名迅涮。
version - 包的版本號(hào)膜毁。
description - 包的描述。
homepage - 包的官網(wǎng) url 壁公。
author - 包的作者姓名。
contributors - 包的其他貢獻(xiàn)者姓名。
dependencies - 依賴包列表拥褂。如果依賴包沒有安裝,npm 會(huì)自動(dòng)將依賴包安裝在 node_module 目錄下牙寞。
repository - 包代碼存放的地方的類型饺鹃,可以是 git 或 svn,git 可在 Github 上间雀。
main - main 字段指定了程序的主入口文件翠储,require('moduleName') 就會(huì)加載這個(gè)文件隘道。這個(gè)字段的默認(rèn)值是模塊根目錄下面的 index.js。
keywords - 關(guān)鍵字
Buffer(緩沖區(qū))
JavaScript 語言自身只有字符串?dāng)?shù)據(jù)類型,沒有二進(jìn)制數(shù)據(jù)類型杠娱。但在處理像TCP流或文件流時(shí),必須使用到二進(jìn)制數(shù)據(jù)稽揭。因此在 Node.js中裆悄,定義了一個(gè) Buffer 類,該類用來創(chuàng)建一個(gè)專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)萎庭。
創(chuàng)建 Buffer 類
Buffer 提供了以下 API 來創(chuàng)建 Buffer 類:
Buffer.alloc(size[, fill[, encoding]]): 返回一個(gè)指定大小的 Buffer 實(shí)例霜医,如果沒有設(shè)置 fill,則默認(rèn)填滿 0
Buffer.allocUnsafe(size): 返回一個(gè)指定大小的 Buffer 實(shí)例驳规,但是它不會(huì)被初始化肴敛,所以它可能包含敏感的數(shù)據(jù)
Buffer.allocUnsafeSlow(size)
Buffer.from(array): 返回一個(gè)被 array 的值初始化的新的 Buffer 實(shí)例(傳入的 array 的元素只能是數(shù)字,不然就會(huì)自動(dòng)被 0 覆蓋)
Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一個(gè)新建的與給定的 ArrayBuffer 共享同一內(nèi)存的 Buffer吗购。
Buffer.from(buffer): 復(fù)制傳入的 Buffer 實(shí)例的數(shù)據(jù)医男,并返回一個(gè)新的 Buffer 實(shí)例
Buffer.from(string[, encoding]): 返回一個(gè)被 string 的值初始化的新的 Buffer 實(shí)例
寫入緩沖區(qū)
buf.write(string[, offset[, length]][, encoding])
string - 寫入緩沖區(qū)的字符串。
offset - 緩沖區(qū)開始寫入的索引值捻勉,默認(rèn)為 0 镀梭。
length - 寫入的字節(jié)數(shù),默認(rèn)為 buffer.length
encoding - 使用的編碼踱启。默認(rèn)為 'utf8' 报账。
從緩沖區(qū)讀取數(shù)據(jù)
buf.toString([encoding[, start[, end]]])
encoding - 使用的編碼研底。默認(rèn)為 'utf8' 。
start - 指定開始讀取的索引位置透罢,默認(rèn)為 0榜晦。
end - 結(jié)束位置,默認(rèn)為緩沖區(qū)的末尾羽圃。
將 Buffer 轉(zhuǎn)換為 JSON 對(duì)象
buf.toJSON()
當(dāng)字符串化一個(gè) Buffer 實(shí)例時(shí)乾胶,會(huì)隱式地調(diào)用該 toJSON()。
緩沖區(qū)合并
Buffer.concat(list[, totalLength])
var buffer1 = Buffer.from(('菜鳥教程'));
var buffer2 = Buffer.from(('www.runoob.com'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
緩沖區(qū)比較
buf.compare(otherBuffer);
otherBuffer - 與 buf 對(duì)象比較的另外一個(gè) Buffer 對(duì)象朽寞。
返回一個(gè)數(shù)字识窿,表示 buf 在 otherBuffer 之前,之后或相同愁憔。
實(shí)例
var buffer1 = Buffer.from('ABC');
var buffer2 = Buffer.from('ABCD');
var result = buffer1.compare(buffer2);
if(result < 0) {
console.log(buffer1 + " 在 " + buffer2 + "之前");
}else if(result == 0){
console.log(buffer1 + " 與 " + buffer2 + "相同");
}else {
console.log(buffer1 + " 在 " + buffer2 + "之后");
}
拷貝緩沖區(qū)
buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
參數(shù)描述如下:
targetBuffer - 要拷貝的 Buffer 對(duì)象腕扶。
targetStart - 數(shù)字, 可選, 默認(rèn): 0
sourceStart - 數(shù)字, 可選, 默認(rèn): 0
sourceEnd - 數(shù)字, 可選, 默認(rèn): buffer.length
實(shí)例
var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('RUNOOB');
//將 buf2 插入到 buf1 指定位置上
buf2.copy(buf1, 2);
console.log(buf1.toString());
執(zhí)行以上代碼,輸出結(jié)果為:
abRUNOOBijkl
緩沖區(qū)裁剪
buf.slice([start[, end]])
參數(shù)描述如下:
start - 數(shù)字, 可選, 默認(rèn): 0
end - 數(shù)字, 可選, 默認(rèn): buffer.length
返回值
返回一個(gè)新的緩沖區(qū)吨掌,它和舊緩沖區(qū)指向同一塊內(nèi)存半抱,但是從索引 start 到 end 的位置剪切。
實(shí)例
var buffer1 = Buffer.from('runoob');
// 剪切緩沖區(qū)
var buffer2 = buffer1.slice(0,2);
console.log("buffer2 content: " + buffer2.toString());
執(zhí)行以上代碼膜宋,輸出結(jié)果為:
buffer2 content: ru
緩沖區(qū)長度
buf.length;
返回值
返回 Buffer 對(duì)象所占據(jù)的內(nèi)存長度窿侈。
Stream(流)
Stream 是一個(gè)抽象接口,Node 中有很多對(duì)象實(shí)現(xiàn)了這個(gè)接口秋茫。例如史简,對(duì)http 服務(wù)器發(fā)起請(qǐng)求的request 對(duì)象就是一個(gè) Stream,還有stdout(標(biāo)準(zhǔn)輸出)肛著。
Node.js圆兵,Stream 有四種流類型:
Readable - 可讀操作。
Writable - 可寫操作枢贿。
Duplex - 可讀可寫操作.
Transform - 操作被寫入數(shù)據(jù)殉农,然后讀出結(jié)果。
所有的 Stream 對(duì)象都是 EventEmitter 的實(shí)例局荚。常用的事件有:
data - 當(dāng)有數(shù)據(jù)可讀時(shí)觸發(fā)超凳。
end - 沒有更多的數(shù)據(jù)可讀時(shí)觸發(fā)。
error - 在接收和寫入過程中發(fā)生錯(cuò)誤時(shí)觸發(fā)耀态。
finish - 所有數(shù)據(jù)已被寫入到底層系統(tǒng)時(shí)觸發(fā)轮傍。
從流中讀取數(shù)據(jù)
var fs = require("fs");
var readerStream = fs.createReadStream('input.txt');
寫入流
var fs = require("fs");
var writerStream = fs.createWriteStream('output.txt');
管道流
管道提供了一個(gè)輸出流到輸入流的機(jī)制。通常我們用于從一個(gè)流中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到另外一個(gè)流中首装。
var fs = require("fs");
var readerStream = fs.createReadStream('input.txt');
var writerStream = fs.createWriteStream('output.txt');
// 管道讀寫操作
// 讀取 input.txt 文件內(nèi)容创夜,并將內(nèi)容寫入到 output.txt 文件中
readerStream.pipe(writerStream);
鏈?zhǔn)搅?/h6>
鏈?zhǔn)绞峭ㄟ^連接輸出流到另外一個(gè)流并創(chuàng)建多個(gè)流操作鏈的機(jī)制。鏈?zhǔn)搅饕话阌糜诠艿啦僮?br>
var fs = require("fs");
var zlib = require('zlib');
// 壓縮 input.txt 文件為 input.txt.gz
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));
console.log("文件壓縮完成仙逻。");
Node.js模塊系統(tǒng)
var hello = require('./hello');
hello.world();
exports.world = function() {
console.log('Hello World');
}
//hello.js
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
//main.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
#######exports 和 module.exports 的使用
如果要對(duì)外暴露屬性或方法挥下,就用 exports 就行揍魂,要暴露對(duì)象(類似class,包含了很多屬性和方法)棚瘟,就用 module.exports。
Node.js 文件系統(tǒng)
Node.js 提供一組類似 UNIX(POSIX)標(biāo)準(zhǔn)的文件操作API喜最。 Node 導(dǎo)入文件系統(tǒng)模塊(fs)語法如下所示:
var fs = require("fs")