node 可讀流與可寫流的運用詳解
先談aip
fs文件系統(tǒng)模塊,是node.js的一個文件操作模塊,這篇文章將演示如何使用它進行流式文件操作
創(chuàng)建一個可讀流
const rs = fs.createReadStream("./1.txt",config)//參1文件路徑,參2配置對象
配置對象舉例
//一般都是直接默認 const config = { encoding:"utf-8",//編碼格式 highWaterMark:3,//每次讀取幾字節(jié),漢字占三字節(jié) autoClose:true,//自動關閉 start:0//從何處開始讀 flawing:false//創(chuàng)建時暫停讀取 flags:'r'//如何讀取 }
flags配置項選項:
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ù)的,我們需要不斷的來接收它
我們假設1.txt里面存儲了: 123456789
const rs = fs.createReadStream("./1.txt",{highWaterMark:1})//每次讀取1字節(jié) /**用來保存可讀流讀取的數(shù)據(jù) */ const arr =[]; rs.on("data", (val) => { console.log(val);//這個函數(shù)會觸發(fā)九次 arr.push(val)//將val添加到數(shù)組末尾 }); //監(jiān)聽end方法,可讀流讀取完畢時該方法調用 rs.on("end",()=>{ console.log(arr) }) //監(jiān)聽錯誤 rs.on("error", (err: Error) => { console.log(err); });
三個十分關鍵的方法
除了這兩個事件,它還有三個十分關鍵的方法
rs.on("data", (val: string) => { console.log(val); rs.pause()//暫停讀取 rs.resume() //繼續(xù)讀取 }); rs.pipe(我是可寫流!下面會說!)//將讀取的文件直接放入寫入的文件中
一些不太常用的監(jiān)聽
rs.on("open", () => { console.log("打開了"); }); rs.on("close", () => { console.log("關閉了"); });
監(jiān)聽書寫的注意事項
const arr = []; rs.on("data", (val) => { console.log(val);//這個函數(shù)會觸發(fā)九次 arr.push(val)//將val添加到數(shù)組末尾 rs.on("end",()=>{ // !!! 注意 這樣書寫監(jiān)聽監(jiān)聽并不會按照我們的預期執(zhí)行 console.log(arr); }) });
使用可寫流寫入數(shù)據(jù)
//創(chuàng)建可寫流 const ws = fs.createWriteStream("./2.text",config) //使用可寫流 ws.write('1')//寫入,當緩存區(qū)滿時會返回false,反之true ws.close()//關閉可寫流 ws.end("寫完我后并關閉可寫流") //偵聽可寫流 ws.on('poen',()=>{console.log('可寫流打開了')}) ws.on('close',()=>{console.log('可寫流關閉了')}) ws.on("drain",()=>{console.log("寫入緩存空了,可以繼續(xù)寫入")})//重要
什么是寫入緩存?
我們調用ws.write()沒有執(zhí)行完畢時是不能執(zhí)行下一個ws.write()的,操作所生成的數(shù)據(jù)被以鏈表的形式儲存在緩存中.鏈表的形式可以保證寫入的順序是正確的.
簡單點說就是可寫流忙不過來了,就搞個內(nèi)存把任務裝起來,有空再去寫入
使用可讀流與可寫流處理文件
這個小dome會以64k為分隔,將1.txt的內(nèi)容拷貝到2.txt里面,這樣的可讀可寫流在客戶端傳大文件給服務器時尤為重要!
//創(chuàng)建可讀流 const rs = fs.createReadStream("./1.txt") //創(chuàng)建可寫流 const ws = fs.createWriteStream("./2.txt") //監(jiān)聽data方法,可讀流每次讀取會調用 rs.on("data", val => { if(!ws.write(val+"64k分隔\n")){//\n是回車,\t是進格... //如果緩存滿了會進此這個代碼塊 rs.pause()//暫停讀取 } }); //監(jiān)聽可寫流的drain方法,寫入緩存空了會調用此方法 ws.on("drain",()=>{ rs.resume() //繼續(xù)讀取 }) //監(jiān)聽end方法,可讀流讀取完畢時該方法調用 rs.on("end",()=>{ console.log("讀取完畢") //記得關閉可寫流!!! ws.close() }) //監(jiān)聽錯誤 rs.on("error", err => console.log(err));
如果僅僅只是使用流復制一份文件
//創(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,//接收文件開關 formidable: { maxFileSize: 1 * 1024 * 1024//最大上傳1M } })); //收到文件后文件常用信息 const file = ctx.request.files.img //img是前端上傳文件時文件對應的key名 file.size //文件大小 file.filepath//文件緩存路徑 file.originalFilename//文件原名稱 file.mimetype//文件類型 file.lastModifiedDate//文件上傳時間 file.newFilename//文件新名稱 file._writeStream//文件可寫流,這個沒啥用... //如果有多個文件,file將會是一個數(shù)組 //可以使用文件的 file.filepath 緩存路徑來創(chuàng)建一個可讀流,然后保存到服務器或者數(shù)據(jù)庫或者第三方平臺
以上就是node 可讀流與可寫流的運用詳解的詳細內(nèi)容,更多關于node 可讀流可寫流的資料請關注腳本之家其它相關文章!
相關文章
Node.js使用officecrypto-tool實現(xiàn)讀取加密的Excel和Word文檔
這篇文章主要為大家詳細介紹了Node.js如何使用officecrypto-tool實現(xiàn)讀取加密的Excel和Word文檔的功能,感興趣的小伙伴可以跟隨小編一起了解一下2023-09-09nodejs基于express實現(xiàn)文件上傳的方法
這篇文章主要介紹了nodejs基于express實現(xiàn)文件上傳的方法,結合實例形式分析了nodejs基于express框架實現(xiàn)文件上傳功能的具體步驟與相關操作技巧,需要的朋友可以參考下2018-03-03