深入淺析node.js中的檔案流

青灯夜游
發布: 2021-11-23 17:58:20
轉載
2173 人瀏覽過

這篇文章給大家剖析一下Nodejs中的文件流,希望對大家有幫助!

深入淺析node.js中的檔案流

檔案流

由於電腦中的各種媒體讀取儲存的速度不同、容量大小不同,因此可能在操作中會有一方存在長期等待的狀態

檔案流主要有三種,分別為輸入流(Readable)輸出流(Writeable)雙工流(Duplex)。其中還有一種流不常用那就是轉換流(Transform)

node中提供了stream 模組,這個模組中有兩個類別實例:Readable和Writable,流中都會繼承這兩個類,因此會有很多共同的方法等。

可讀流(Readable)

輸入流:資料從源頭流向內存,把磁碟裡面的資料傳到記憶體裡面。

createReadStream

fs.createReadStream(路徑, 設定)

在設定裡面有:encoding(編碼方式)、start(起始讀取位元組)、end(結束讀取位元組)、highWaterMark(每次讀取量)

highWaterMark:如果encoding有值,數量表示一個字元數;如果encoding為null,數量表示字節數

傳回一個Readable的子類別ReadStream

const readable = fs.createReadStream(filename, { encoding: 'utf-8', start: 1, end: 2, // highWaterMark: });

註冊事件

readable.on(事件名,處理函數)

readable.on('open', (err, data)=> { // console.log(err); console.log('文件打开了'); }) readable.on('error', (data, err) => { console.log(data, err); console.log('读取文件发生错误'); }) readable.on('close', (data, err) => { // console.log(data, err); console.log('文件关闭'); }) readable.close() // 手动触发通过 readable.close()或者在文件读取完毕之后自动关闭--autoClose配置项默认为 true readable.on('data', (data) => { console.log(data); console.log('文件正在读取'); }) readable.on('end', ()=>{ console.log('文件读取完毕'); })
登入後複製

#暫停讀取

readable.pause() 暫停讀取,會觸發pause 事件

#恢復讀取

readable.resume() 復原讀取,會觸發resume 事件

可寫入流

#const ws = fs.createWriteStream(filename[, 設定])

#ws.write(data)

寫入一個數據,data 可以讓字串也可以是Buffer,傳回一個布林值。

如果回傳的是 true 表示寫入通道沒有被佔滿,接下來的資料可以直接寫入,寫入通道就是配置中的 highWaterMark 表示的大小。

如果傳回的是false 表示寫入通道佔滿,其餘字元開始等待,出現背壓狀況。

const ws = fs.createWriteStream(filename, { encoding: 'utf-8', highWaterMark: 2 }) const flag = ws.write('刘'); console.log(flag); // false 这里虽然只会执行一次,但是在通道有空余空间的时候就会继续写入,并不在返回 值。 ws.write() 只会返回一次值。 const flag = ws.write('a'); console.log(flag); const flag1 = ws.write('a'); console.log(flag1); const flag2 = ws.write('a'); console.log(flag2); const flag3 = ws.write('a'); console.log(flag3); 输出顺序:true、false、false、false 第二次写入的时候已经占了两字节,第三次写入后直接占满了,所以返回false
登入後複製

使用流複製貼上文件,並解決背壓問題

const filename = path.resolve(__dirname, './file/write.txt'); const wsfilename = path.resolve(__dirname, './file/writecopy.txt'); const ws = fs.createWriteStream(wsfilename); const rs = fs.createReadStream(filename) rs.on('data', chumk => { const falg = ws.write(chumk); if(!falg) { rs.pause(); } }) ws.on('drain', () => { rs.resume(); }) rs.on('close', () => { ws.end(); console.log('copy end'); })
登入後複製

pipe

使用pipe 也可以直接將可讀流和寫入流串聯起來,也可以解決背壓問題

rs.pipe(ws); rs.on('close', () => { ws.end(); console.log('copy end'); })
登入後複製

學習下來,感覺文件流在大量文件讀寫的時候是很方便的,並且可以做到快速高效,相比於writeFilereadFile效率高很多,正確處理也不會有很大的阻塞出現。

更多node相關知識,請造訪:nodejs 教學! !

以上是深入淺析node.js中的檔案流的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!