欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

node 可讀流與可寫流的運用詳解

 更新時間:2022年09月15日 14:23:32   作者:ljb2458  
這篇文章主要為大家介紹了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中的fs.fsyncSync方法使用說明

    node.js中的fs.fsyncSync方法使用說明

    這篇文章主要介紹了node.js中的fs.fsyncSync方法使用說明,本文介紹了fs.fsyncSync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Express 配置HTML頁面訪問的實現(xiàn)

    Express 配置HTML頁面訪問的實現(xiàn)

    這篇文章主要介紹了Express 配置HTML頁面訪問的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • vscode調試node.js的實現(xiàn)方法

    vscode調試node.js的實現(xiàn)方法

    這篇文章主要介紹了vscode調試node.js的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Egret引擎開發(fā)指南之創(chuàng)建項目

    Egret引擎開發(fā)指南之創(chuàng)建項目

    Egret Engine(白鷺引擎)是一款使用TypeScript語言構建的開源免費的移動游戲引擎。白鷺引擎的核心定位是開放,高效,優(yōu)雅。通過它,你可以快速地創(chuàng)建HTML5類型的移動游戲,也可以將游戲項目編譯輸出成為目標移動平臺的原生游戲應用。
    2014-09-09
  • node.js中axios使用心得總結

    node.js中axios使用心得總結

    這篇文章主要介紹了node.js中axios使用心得總結,以及分析了中間遇到的錯誤,大家參考一下。
    2017-11-11
  • Node.js使用officecrypto-tool實現(xiàn)讀取加密的Excel和Word文檔

    Node.js使用officecrypto-tool實現(xiàn)讀取加密的Excel和Word文檔

    這篇文章主要為大家詳細介紹了Node.js如何使用officecrypto-tool實現(xiàn)讀取加密的Excel和Word文檔的功能,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09
  • nodejs基于express實現(xiàn)文件上傳的方法

    nodejs基于express實現(xiàn)文件上傳的方法

    這篇文章主要介紹了nodejs基于express實現(xiàn)文件上傳的方法,結合實例形式分析了nodejs基于express框架實現(xiàn)文件上傳功能的具體步驟與相關操作技巧,需要的朋友可以參考下
    2018-03-03
  • node+express+ejs制作簡單頁面上手指南

    node+express+ejs制作簡單頁面上手指南

    本文記錄了使用node+express+ejs制作簡單頁面的全過程,話說express+ejs真的是太難了,有種蛋蛋的憂傷~
    2014-11-11
  • mac上node.js環(huán)境的安裝測試

    mac上node.js環(huán)境的安裝測試

    這篇文章主要為大家詳細介紹了mac上node.js環(huán)境的安裝測試,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • node.js中path路徑模塊的使用方法實例分析

    node.js中path路徑模塊的使用方法實例分析

    這篇文章主要介紹了node.js中path路徑模塊的使用方法,結合實例形式分析了node.js path路徑模塊的基本功能、原理、使用方法及操作注意事項,需要的朋友可以參考下
    2020-02-02

最新評論