Node.js中的Stream 有四種流類型:node
Readable - 可讀操做。學習
Writable - 可寫操做。ui
Duplex - 可讀可寫操做.編碼
Transform - 操做被寫入數據,而後讀出結果。spa
全部的 Stream 對象都是 EventEmitter 的實例。經常使用的事件有:code
data - 當有數據可讀時觸發。orm
end - 沒有更多的數據可讀時觸發。對象
error - 在接收和寫入過程當中發生錯誤時觸發。blog
finish - 全部數據已被寫入到底層系統時觸發。事件
先建立一個test.txt
cyy在學習node.js
而後是main.js
var fs=require("fs"); var mydata=""; //建立可讀流 var stream=fs.createReadStream("test.txt"); //設置編碼 stream.setEncoding("utf8"); stream.on("data",function(data){ mydata+= data; }) stream.on("end",function(){ console.log(mydata); }) stream.on("error",function(err){ console.log(err.stack); }) console.log("讀取文件結束");
打印結果:
寫入流(寫入文件)
mian.js
var fs=require("fs"); var mydata="這是我要寫入文件的內容"; //建立可讀流 var stream=fs.createWriteStream("test.txt"); //設置編碼 stream.write(mydata,"utf8"); stream.end();//標記文件末尾 stream.on("finish",function(){ console.log("寫入結束"); }) stream.on("error",function(err){ console.log(err.stack); }) console.log("操做結束");
而後查看剛纔的test.txt
這是我要寫入文件的內容
管道流(文件內容複製)
管道提供了一個輸出流到輸入流的機制。一般咱們用於從一個流中獲取數據並將數據傳遞到另一個流中。
首先test.txt
這是在test.txt中的內容
而後test2.txt爲空
main.js
var fs=require("fs"); var mydata="這是我要寫入文件的內容"; //建立可讀流 var stream=fs.createReadStream("test.txt"); //建立可寫流 var stream2=fs.createWriteStream("test2.txt"); stream.pipe(stream2); console.log("複製結束");
此時查看本來爲空的test2.txt
這是在test.txt中的內容
鏈式流(可用於解壓縮文件)
鏈式是經過鏈接輸出流到另一個流並建立多個流操做鏈的機制。鏈式流通常用於管道操做。
首先壓縮文件操做:
var fs=require("fs"); var zlib=require("zlib"); //壓縮 fs.createReadStream("test.txt") .pipe(zlib.createGzip()) .pipe(fs.createWriteStream("test.txt.gz")); console.log("壓縮結束");
而後是解壓操做:
var fs=require("fs"); var zlib=require("zlib"); //解壓 fs.createReadStream("test.txt.gz") .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream("test3.txt")); console.log("解壓結束");