本文實例講述了node.js中stream流中可讀流和可寫流的實現與使用方法。分享給大家供大家參考,具體如下:
node.js中的流 stream 是處理流式數據的抽象接口。node.js 提供了很多流對象,像http中的request和response,和 process.stdout 都是流的實例。
流可以是 可讀的,可寫的,或是可讀可寫的。所有流都是 events 的實例。
一、流的類型
node.js中有四種基本流類型:
1、Writable 可寫流 (例:fs.createWriteStream() )
2、Readable 可讀流 (例:fs.createReadStream() )
3、Duplex 可讀又可寫流 (例:net.Socket )
4、Transform 讀寫過程中可修改或轉換數據的 Duplex 流 (例:zlib.createDeflate() )
二、流中的數據有兩種模式
1、二進制模式,都是 string字符串 和 Buffer。
2、對象模式,流內部處理的是一系統普通對象。
三、可讀流的兩種模式
1、流動模式 ( flowing ) ,數據自動從系統底層讀取,并通過事件,盡可能快地提供給應用程序。
2、暫停模式 ( paused ),必須顯式的調用 read() 讀取數據。
可讀流 都開始于暫停模式,可以通過如下方法切換到流動模式:
1、添加 'data' 事件回調。
2、調用 resume()。
3、調用 pipe()。
可讀流通過如下方法切換回暫停模式:
1、如果沒有管道目標,調用 pause()。
2、如果有管道目標,移除所有管道目標,調用 unpipe() 移除多個管道目標。
四、創建可讀流,并監聽事件
const fs = require('fs');//創建一個文件可讀流let rs = fs.createReadStream('./1.txt', { //文件系統標志 flags: 'r', //數據編碼,如果調置了該參數,則讀取的數據會自動解析 //如果沒調置,則讀取的數據會是 Buffer //也可以通過 rs.setEncoding() 進行設置 encoding: 'utf8', //文件描述符,默認為null fd: null, //文件權限 mode: 0o666, //文件讀取的開始位置 start: 0, //文件讀取的結束位置(包括結束位置) end: Infinity, //讀取緩沖區的大小,默認64K highWaterMark: 3});//文件被打開時觸發rs.on('open', function () { console.log('文件打開');});//監聽data事件,會讓當前流切換到流動模式//當流中將數據傳給消費者后觸發//由于我們在上面配置了 highWaterMark 為 3字節,所以下面會打印多次。rs.on('data', function (data) { console.log(data);});//流中沒有數據可供消費者時觸發rs.on('end', function () { console.log('數據讀取完畢');});//讀取數據出錯時觸發rs.on('error', function () { console.log('讀取錯誤');});//當文件被關閉時觸發rs.on('close', function () { console.log('文件關閉');});注意,'open' 和 'close' 事件并不是所有流都會觸發。
當們監聽'data'事件后,系統會盡可能快的讀取出數據。但有時候,我們需要暫停一下流的讀取,操作其他事情。
新聞熱點
疑難解答
圖片精選