node 可讀流與可寫流的運(yùn)用詳解
先談aip
fs文件系統(tǒng)模塊,是node.js的一個(gè)文件操作模塊,這篇文章將演示如何使用它進(jìn)行流式文件操作
創(chuàng)建一個(gè)可讀流
const rs = fs.createReadStream("./1.txt",config)//參1文件路徑,參2配置對象
配置對象舉例
//一般都是直接默認(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里面存儲了: 123456789
const rs = fs.createReadStream("./1.txt",{highWaterMark:1})//每次讀取1字節(jié)
/**用來保存可讀流讀取的數(shù)據(jù) */
const arr =[];
rs.on("data", (val) => {
console.log(val);//這個(gè)函數(shù)會觸發(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(我是可寫流!下面會說!)//將讀取的文件直接放入寫入的文件中
一些不太常用的監(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ù)會觸發(fā)九次
arr.push(val)//將val添加到數(shù)組末尾
rs.on("end",()=>{
// !!! 注意 這樣書寫監(jiān)聽監(jiān)聽并不會按照我們的預(yù)期執(zhí)行
console.log(arr);
})
});
使用可寫流寫入數(shù)據(jù)
//創(chuàng)建可寫流
const ws = fs.createWriteStream("./2.text",config)
//使用可寫流
ws.write('1')//寫入,當(dāng)緩存區(qū)滿時(shí)會返回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ù)被以鏈表的形式儲存在緩存中.鏈表的形式可以保證寫入的順序是正確的.
簡單點(diǎn)說就是可寫流忙不過來了,就搞個(gè)內(nèi)存把任務(wù)裝起來,有空再去寫入
使用可讀流與可寫流處理文件
這個(gè)小dome會以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方法,可讀流每次讀取會調(diào)用
rs.on("data", val => {
if(!ws.write(val+"64k分隔\n")){//\n是回車,\t是進(jìn)格...
//如果緩存滿了會進(jìn)此這個(gè)代碼塊
rs.pause()//暫停讀取
}
});
//監(jiān)聽可寫流的drain方法,寫入緩存空了會調(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í)文件對應(yīng)的key名
file.size //文件大小
file.filepath//文件緩存路徑
file.originalFilename//文件原名稱
file.mimetype//文件類型
file.lastModifiedDate//文件上傳時(shí)間
file.newFilename//文件新名稱
file._writeStream//文件可寫流,這個(gè)沒啥用...
//如果有多個(gè)文件,file將會是一個(gè)數(shù)組
//可以使用文件的 file.filepath 緩存路徑來創(chuàng)建一個(gè)可讀流,然后保存到服務(wù)器或者數(shù)據(jù)庫或者第三方平臺

以上就是node 可讀流與可寫流的運(yùn)用詳解的詳細(xì)內(nèi)容,更多關(guān)于node 可讀流可寫流的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Express 配置HTML頁面訪問的實(shí)現(xiàn)
這篇文章主要介紹了Express 配置HTML頁面訪問的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
vscode調(diào)試node.js的實(shí)現(xiàn)方法
這篇文章主要介紹了vscode調(diào)試node.js的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Egret引擎開發(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)平臺的原生游戲應(yīng)用。2014-09-09
Node.js使用officecrypto-tool實(shí)現(xiàn)讀取加密的Excel和Word文檔
這篇文章主要為大家詳細(xì)介紹了Node.js如何使用officecrypto-tool實(shí)現(xiàn)讀取加密的Excel和Word文檔的功能,感興趣的小伙伴可以跟隨小編一起了解一下2023-09-09
nodejs基于express實(shí)現(xiàn)文件上傳的方法
這篇文章主要介紹了nodejs基于express實(shí)現(xiàn)文件上傳的方法,結(jié)合實(shí)例形式分析了nodejs基于express框架實(shí)現(xiàn)文件上傳功能的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
node.js中path路徑模塊的使用方法實(shí)例分析
這篇文章主要介紹了node.js中path路徑模塊的使用方法,結(jié)合實(shí)例形式分析了node.js path路徑模塊的基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-02-02

