node 可讀流與可寫流的運(yùn)用詳解
先談aip
fs文件系統(tǒng)模塊,是node.js的一個(gè)文件操作模塊,這篇文章將演示如何使用它進(jìn)行流式文件操作
創(chuàng)建一個(gè)可讀流
const rs = fs.createReadStream("./1.txt",config)//參1文件路徑,參2配置對(duì)象
配置對(duì)象舉例
//一般都是直接默認(rèn) const config = { encoding:"utf-8",//編碼格式 highWaterMark:3,//每次讀取幾字節(jié),漢字占三字節(jié) autoClose:true,//自動(dòng)關(guān)閉 start:0//從何處開始讀 flawing:false//創(chuàng)建時(shí)暫停讀取 flags:'r'//如何讀取 }
flags配置項(xiàng)選項(xiàng):
flags值 | 功能 |
---|---|
r | 以讀取模式打開文件。如果文件不存在拋出異常。 |
r+ | 以讀寫模式打開文件。如果文件不存在拋出異常。 |
rs | 以同步的方式讀取文件。 |
rs+ | 以同步的方式讀取和寫入文件。 |
w | 以寫入模式打開文件,如果文件不存在則創(chuàng)建。 |
wx | 類似 'w',但是如果文件路徑存在,則文件寫入失敗。 |
w+ | 以讀寫模式打開文件,如果文件不存在則創(chuàng)建。 |
wx+ | 類似 'w+', 但是如果文件路徑存在,則文件讀寫失敗。 |
a | 以追加模式打開文件,如果文件不存在則創(chuàng)建。 |
ax | 類似 'a', 但是如果文件路徑存在,則文件追加失敗。 |
a+ | 以讀取追加模式打開文件,如果文件不存在則創(chuàng)建。 |
ax+ | 類似 'a+', 但是如果文件路徑存在,則文件讀取追加失敗。 |
使用可讀流讀取數(shù)據(jù)
可讀流是一種流式的,持續(xù)的讀取,所以給我們的數(shù)據(jù)也是持續(xù)的,我們需要不斷的來接收它
我們假設(shè)1.txt里面存儲(chǔ)了: 123456789
const rs = fs.createReadStream("./1.txt",{highWaterMark:1})//每次讀取1字節(jié) /**用來保存可讀流讀取的數(shù)據(jù) */ const arr =[]; rs.on("data", (val) => { console.log(val);//這個(gè)函數(shù)會(huì)觸發(fā)九次 arr.push(val)//將val添加到數(shù)組末尾 }); //監(jiān)聽end方法,可讀流讀取完畢時(shí)該方法調(diào)用 rs.on("end",()=>{ console.log(arr) }) //監(jiān)聽錯(cuò)誤 rs.on("error", (err: Error) => { console.log(err); });
三個(gè)十分關(guān)鍵的方法
除了這兩個(gè)事件,它還有三個(gè)十分關(guān)鍵的方法
rs.on("data", (val: string) => { console.log(val); rs.pause()//暫停讀取 rs.resume() //繼續(xù)讀取 }); rs.pipe(我是可寫流!下面會(huì)說!)//將讀取的文件直接放入寫入的文件中
一些不太常用的監(jiān)聽
rs.on("open", () => { console.log("打開了"); }); rs.on("close", () => { console.log("關(guān)閉了"); });
監(jiān)聽書寫的注意事項(xiàng)
const arr = []; rs.on("data", (val) => { console.log(val);//這個(gè)函數(shù)會(huì)觸發(fā)九次 arr.push(val)//將val添加到數(shù)組末尾 rs.on("end",()=>{ // !!! 注意 這樣書寫監(jiān)聽監(jiān)聽并不會(huì)按照我們的預(yù)期執(zhí)行 console.log(arr); }) });
使用可寫流寫入數(shù)據(jù)
//創(chuàng)建可寫流 const ws = fs.createWriteStream("./2.text",config) //使用可寫流 ws.write('1')//寫入,當(dāng)緩存區(qū)滿時(shí)會(huì)返回false,反之true ws.close()//關(guān)閉可寫流 ws.end("寫完我后并關(guān)閉可寫流") //偵聽可寫流 ws.on('poen',()=>{console.log('可寫流打開了')}) ws.on('close',()=>{console.log('可寫流關(guān)閉了')}) ws.on("drain",()=>{console.log("寫入緩存空了,可以繼續(xù)寫入")})//重要
什么是寫入緩存?
我們調(diào)用ws.write()沒有執(zhí)行完畢時(shí)是不能執(zhí)行下一個(gè)ws.write()的,操作所生成的數(shù)據(jù)被以鏈表的形式儲(chǔ)存在緩存中.鏈表的形式可以保證寫入的順序是正確的.
簡(jiǎn)單點(diǎn)說就是可寫流忙不過來了,就搞個(gè)內(nèi)存把任務(wù)裝起來,有空再去寫入
使用可讀流與可寫流處理文件
這個(gè)小dome會(huì)以64k為分隔,將1.txt的內(nèi)容拷貝到2.txt里面,這樣的可讀可寫流在客戶端傳大文件給服務(wù)器時(shí)尤為重要!
//創(chuàng)建可讀流 const rs = fs.createReadStream("./1.txt") //創(chuàng)建可寫流 const ws = fs.createWriteStream("./2.txt") //監(jiān)聽data方法,可讀流每次讀取會(huì)調(diào)用 rs.on("data", val => { if(!ws.write(val+"64k分隔\n")){//\n是回車,\t是進(jìn)格... //如果緩存滿了會(huì)進(jìn)此這個(gè)代碼塊 rs.pause()//暫停讀取 } }); //監(jiān)聽可寫流的drain方法,寫入緩存空了會(huì)調(diào)用此方法 ws.on("drain",()=>{ rs.resume() //繼續(xù)讀取 }) //監(jiān)聽end方法,可讀流讀取完畢時(shí)該方法調(diào)用 rs.on("end",()=>{ console.log("讀取完畢") //記得關(guān)閉可寫流!!! ws.close() }) //監(jiān)聽錯(cuò)誤 rs.on("error", err => console.log(err));
如果僅僅只是使用流復(fù)制一份文件
//創(chuàng)建可讀流 const rs = fs.createReadStream("./1.txt") //創(chuàng)建可寫流 const ws = fs.createWriteStream("./2.txt") rs.pipe(ws)//這就搞定了!,非常方便...
koa框架文件上傳
# 安裝koa-body npm i koa-body
cosnt koaBody = require('koa-body') app.use(koaBody({ multipart: true,//接收文件開關(guān) formidable: { maxFileSize: 1 * 1024 * 1024//最大上傳1M } })); //收到文件后文件常用信息 const file = ctx.request.files.img //img是前端上傳文件時(shí)文件對(duì)應(yīng)的key名 file.size //文件大小 file.filepath//文件緩存路徑 file.originalFilename//文件原名稱 file.mimetype//文件類型 file.lastModifiedDate//文件上傳時(shí)間 file.newFilename//文件新名稱 file._writeStream//文件可寫流,這個(gè)沒啥用... //如果有多個(gè)文件,file將會(huì)是一個(gè)數(shù)組 //可以使用文件的 file.filepath 緩存路徑來創(chuàng)建一個(gè)可讀流,然后保存到服務(wù)器或者數(shù)據(jù)庫(kù)或者第三方平臺(tái)
以上就是node 可讀流與可寫流的運(yùn)用詳解的詳細(xì)內(nèi)容,更多關(guān)于node 可讀流可寫流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Express 配置HTML頁(yè)面訪問的實(shí)現(xiàn)
這篇文章主要介紹了Express 配置HTML頁(yè)面訪問的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11vscode調(diào)試node.js的實(shí)現(xiàn)方法
這篇文章主要介紹了vscode調(diào)試node.js的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Egret引擎開發(fā)指南之創(chuàng)建項(xiàng)目
Egret Engine(白鷺引擎)是一款使用TypeScript語言構(gòu)建的開源免費(fèi)的移動(dòng)游戲引擎。白鷺引擎的核心定位是開放,高效,優(yōu)雅。通過它,你可以快速地創(chuàng)建HTML5類型的移動(dòng)游戲,也可以將游戲項(xiàng)目編譯輸出成為目標(biāo)移動(dòng)平臺(tái)的原生游戲應(yīng)用。2014-09-09Node.js使用officecrypto-tool實(shí)現(xiàn)讀取加密的Excel和Word文檔
這篇文章主要為大家詳細(xì)介紹了Node.js如何使用officecrypto-tool實(shí)現(xiàn)讀取加密的Excel和Word文檔的功能,感興趣的小伙伴可以跟隨小編一起了解一下2023-09-09nodejs基于express實(shí)現(xiàn)文件上傳的方法
這篇文章主要介紹了nodejs基于express實(shí)現(xiàn)文件上傳的方法,結(jié)合實(shí)例形式分析了nodejs基于express框架實(shí)現(xiàn)文件上傳功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2018-03-03node+express+ejs制作簡(jiǎn)單頁(yè)面上手指南
本文記錄了使用node+express+ejs制作簡(jiǎn)單頁(yè)面的全過程,話說express+ejs真的是太難了,有種蛋蛋的憂傷~2014-11-11node.js中path路徑模塊的使用方法實(shí)例分析
這篇文章主要介紹了node.js中path路徑模塊的使用方法,結(jié)合實(shí)例形式分析了node.js path路徑模塊的基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-02-02