最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NodeJS提供了的文件操作相關(guān)的API

 更新時間:2023年11月18日 15:59:51   投稿:yin  
讓前端覺得如獲神器的不是NodeJS能做網(wǎng)絡(luò)編程,而是NodeJS能夠操作文件,小至文件查找,大至代碼編譯,幾乎沒有一個前端工具不操作文件,換個角度講,幾乎也只需要一些數(shù)據(jù)處理邏輯,再加上一些文件操作,就能夠編寫出大多數(shù)前端工具

讓前端覺得如獲神器的不是NodeJS能做網(wǎng)絡(luò)編程,而是NodeJS能夠操作文件,小至文件查找,大至代碼編譯,幾乎沒有一個前端工具不操作文件,換個角度講,幾乎也只需要一些數(shù)據(jù)處理邏輯,再加上一些文件操作,就能夠編寫出大多數(shù)前端工具。我們先大致看看NodeJS提供了哪些和文件操作有關(guān)的API。這里并不逐一介紹每個API的使用方法,官方文檔已經(jīng)做得很好了。

Buffer(數(shù)據(jù)塊)

**官方文檔: **http://nodejs.org/api/buffer.html

JS語言自身只有字符串?dāng)?shù)據(jù)類型,沒有二進制數(shù)據(jù)類型,因此NodeJS提供了一個與String對等的全局構(gòu)造函數(shù)Buffer來提供對二進制數(shù)據(jù)的操作。除了可以讀取文件得到Buffer的實例外,還能夠直接構(gòu)造,例如:

var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);

Buffer與字符串類似,除了可以用.length屬性得到字節(jié)長度外,還可以用[index]方式讀取指定位置的字節(jié),例如:

bin[0]; // => 0x68;

Buffer與字符串能夠互相轉(zhuǎn)化,例如可以使用指定編碼將二進制數(shù)據(jù)轉(zhuǎn)化為字符串:

var str = bin.toString('utf-8'); // => "hello"

或者反過來,將字符串轉(zhuǎn)換為指定編碼下的二進制數(shù)據(jù):

var bin = new Buffer('hello', 'utf-8'); // => <Buffer 68 65 6c 6c 6f>

Buffer與字符串有一個重要區(qū)別。字符串是只讀的,并且對字符串的任何修改得到的都是一個新字符串,原字符串保持不變。至于Buffer,更像是可以做指針操作的C語言數(shù)組。例如,可以用[index]方式直接修改某個位置的字節(jié)。

bin[0] = 0x48;

.slice方法也不是返回一個新的Buffer,而更像是返回了指向原Buffer中間的某個位置的指針,如下所示。

[ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]
    ^           ^
    |           |
   bin     bin.slice(2)

因此對.slice方法返回的Buffer的修改會作用于原Buffer,例如:

var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);
var sub = bin.slice(2);

sub[0] = 0x65;
console.log(bin); // => <Buffer 68 65 65 6c 6f>

也因此,如果想要拷貝一份Buffer,得首先創(chuàng)建一個新的Buffer,并通過.copy方法把原Buffer中的數(shù)據(jù)復(fù)制過去。這個類似于申請一塊新的內(nèi)存,并把已有內(nèi)存中的數(shù)據(jù)復(fù)制過去。以下是一個例子。

var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);
var dup = new Buffer(bin.length);

bin.copy(dup);
dup[0] = 0x48;
console.log(bin); // => <Buffer 68 65 6c 6c 6f>
console.log(dup); // => <Buffer 48 65 65 6c 6f>

總之,Buffer將JS的數(shù)據(jù)處理能力從字符串?dāng)U展到了任意二進制數(shù)據(jù)。

Stream(數(shù)據(jù)流)

**官方文檔: **http://nodejs.org/api/stream.html

當(dāng)內(nèi)存中無法一次裝下需要處理的數(shù)據(jù)時,或者一邊讀取一邊處理更加高效時,我們就需要用到數(shù)據(jù)流。NodeJS中通過各種Stream來提供對數(shù)據(jù)流的操作。

以上邊的大文件拷貝程序為例,我們可以為數(shù)據(jù)來源創(chuàng)建一個只讀數(shù)據(jù)流,示例如下:

var rs = fs.createReadStream(pathname);

rs.on('data', function (chunk) {
    doSomething(chunk);
});

rs.on('end', function () {
    cleanUp();
});

豆知識:Stream基于事件機制工作,所有Stream的實例都繼承于NodeJS提供的EventEmitter。

上邊的代碼中data事件會源源不斷地被觸發(fā),不管doSomething函數(shù)是否處理得過來。代碼可以繼續(xù)做如下改造,以解決這個問題。

var rs = fs.createReadStream(src);

rs.on('data', function (chunk) {
    rs.pause();
    doSomething(chunk, function () {
        rs.resume();
    });
});

rs.on('end', function () {
    cleanUp();
});

以上代碼給doSomething函數(shù)加上了回調(diào),因此我們可以在處理數(shù)據(jù)前暫停數(shù)據(jù)讀取,并在處理數(shù)據(jù)后繼續(xù)讀取數(shù)據(jù)。

此外,我們也可以為數(shù)據(jù)目標(biāo)創(chuàng)建一個只寫數(shù)據(jù)流,示例如下:

var rs = fs.createReadStream(src);
var ws = fs.createWriteStream(dst);

rs.on('data', function (chunk) {
    ws.write(chunk);
});

rs.on('end', function () {
    ws.end();
});

我們把doSomething換成了往只寫數(shù)據(jù)流里寫入數(shù)據(jù)后,以上代碼看起來就像是一個文件拷貝程序了。但是以上代碼存在上邊提到的問題,如果寫入速度跟不上讀取速度的話,只寫數(shù)據(jù)流內(nèi)部的緩存會爆倉。我們可以根據(jù).write方法的返回值來判斷傳入的數(shù)據(jù)是寫入目標(biāo)了,還是臨時放在了緩存了,并根據(jù)drain事件來判斷什么時候只寫數(shù)據(jù)流已經(jīng)將緩存中的數(shù)據(jù)寫入目標(biāo),可以傳入下一個待寫數(shù)據(jù)了。因此代碼可以改造如下:

var rs = fs.createReadStream(src);
var ws = fs.createWriteStream(dst);

rs.on('data', function (chunk) {
    if (ws.write(chunk) === false) {
        rs.pause();
    }
});

rs.on('end', function () {
    ws.end();
});

ws.on('drain', function () {
    rs.resume();
});

以上代碼實現(xiàn)了數(shù)據(jù)從只讀數(shù)據(jù)流到只寫數(shù)據(jù)流的搬運,并包括了防爆倉控制。因為這種使用場景很多,例如上邊的大文件拷貝程序,NodeJS直接提供了.pipe方法來做這件事情,其內(nèi)部實現(xiàn)方式與上邊的代碼類似。

File System(文件系統(tǒng))

**官方文檔: **http://nodejs.org/api/fs.html

NodeJS通過fs內(nèi)置模塊提供對文件的操作。fs模塊提供的API基本上可以分為以下三類:

  • 文件屬性讀寫。

    其中常用的有fs.stat、fs.chmodfs.chown等等。

  • 文件內(nèi)容讀寫。

    其中常用的有fs.readFile、fs.readdir、fs.writeFilefs.mkdir等等。

  • 底層文件操作。

    其中常用的有fs.openfs.read、fs.writefs.close等等。

NodeJS最精華的異步IO模型在fs模塊里有著充分的體現(xiàn),例如上邊提到的這些API都通過回調(diào)函數(shù)傳遞結(jié)果。以fs.readFile為例:

fs.readFile(pathname, function (err, data) {
    if (err) {
        // Deal with error.
    } else {
        // Deal with data.
    }
});

如上邊代碼所示,基本上所有fs模塊API的回調(diào)參數(shù)都有兩個。第一個參數(shù)在有錯誤發(fā)生時等于異常對象,第二個參數(shù)始終用于返回API方法執(zhí)行結(jié)果。

此外,fs模塊的所有異步API都有對應(yīng)的同步版本,用于無法使用異步操作時,或者同步操作更方便時的情況。同步API除了方法名的末尾多了一個Sync之外,異常對象與執(zhí)行結(jié)果的傳遞方式也有相應(yīng)變化。同樣以fs.readFileSync為例:

try {
    var data = fs.readFileSync(pathname);
    // Deal with data.
} catch (err) {
    // Deal with error.
}

fs模塊提供的API很多,這里不一一介紹,需要時請自行查閱官方文檔。

Path(路徑)

**官方文檔: **http://nodejs.org/api/path.html

操作文件時難免不與文件路徑打交道。NodeJS提供了path內(nèi)置模塊來簡化路徑相關(guān)操作,并提升代碼可讀性。以下分別介紹幾個常用的API。

  • path.normalize

    將傳入的路徑轉(zhuǎn)換為標(biāo)準(zhǔn)路徑,具體講的話,除了解析路徑中的...外,還能去掉多余的斜杠。如果有程序需要使用路徑作為某些數(shù)據(jù)的索引,但又允許用戶隨意輸入路徑時,就需要使用該方法保證路徑的唯一性。以下是一個例子:

      var cache = {};
    
      function store(key, value) {
          cache[path.normalize(key)] = value;
      }
    
      store('foo/bar', 1);
      store('foo//baz//../bar', 2);
      console.log(cache);  // => { "foo/bar": 2 }
    

    **坑出沒注意: **標(biāo)準(zhǔn)化之后的路徑里的斜杠在Windows系統(tǒng)下是\,而在Linux系統(tǒng)下是/。如果想保證任何系統(tǒng)下都使用/作為路徑分隔符的話,需要用.replace(/\\/g, '/')再替換一下標(biāo)準(zhǔn)路徑。

  • path.join

    將傳入的多個路徑拼接為標(biāo)準(zhǔn)路徑。該方法可避免手工拼接路徑字符串的繁瑣,并且能在不同系統(tǒng)下正確使用相應(yīng)的路徑分隔符。以下是一個例子:

      path.join('foo/', 'baz/', '../bar'); // => "foo/bar"
    
  • path.extname

    當(dāng)我們需要根據(jù)不同文件擴展名做不同操作時,該方法就顯得很好用。以下是一個例子:

      path.extname('foo/bar.js'); // => ".js"
    

path模塊提供的其余方法也不多,稍微看一下官方文檔就能全部掌握。

到此這篇關(guān)于NodeJS提供了的文件操作相關(guān)的API的文章就介紹到這了,更多相關(guān)NodeJS文件操作的API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • node.js利用socket.io實現(xiàn)多人在線匹配聯(lián)機五子棋

    node.js利用socket.io實現(xiàn)多人在線匹配聯(lián)機五子棋

    這篇文章主要介紹了node.js利用socket.io實現(xiàn)多人在線匹配聯(lián)機五子棋的操作方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • 在Node.js中將SVG圖像轉(zhuǎn)換為PNG,JPEG,TIFF,WEBP和HEIF格式的方法

    在Node.js中將SVG圖像轉(zhuǎn)換為PNG,JPEG,TIFF,WEBP和HEIF格式的方法

    這篇文章主要介紹了在Node.js中將SVG圖像轉(zhuǎn)換為PNG,JPEG,TIFF,WEBP和HEIF格式的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Nodejs學(xué)習(xí)筆記之NET模塊

    Nodejs學(xué)習(xí)筆記之NET模塊

    之前兩篇文章基本上都是給我們介紹的nodejs的理論基礎(chǔ),今天我們來點干貨,先從NET模塊開始講起吧。
    2015-01-01
  • 利用PM2部署node.js項目的方法教程

    利用PM2部署node.js項目的方法教程

    pm2 = P (rocess) M (anager)2,是可以用于生產(chǎn)環(huán)境的Nodejs的進程管理工具,并且它內(nèi)置一個負載均衡。下面這篇文章主要給大家介紹了利用PM2部署node.js項目的方法教程,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • node.js中的fs.read方法使用說明

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

    這篇文章主要介紹了node.js中的fs.read方法使用說明,本文介紹了fs.read方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js與MySQL交互操作及其注意事項

    Node.js與MySQL交互操作及其注意事項

    這篇文章給大家主要介紹了Node.js與MySQL交互操作及其注意事項,非常的詳細,有相同需求的小伙伴可以參考下
    2016-10-10
  • node.js中的buffer.toJSON方法使用說明

    node.js中的buffer.toJSON方法使用說明

    這篇文章主要介紹了node.js中的buffer.toJSON方法使用說明,本文介紹了buffer.toJSON的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js實現(xiàn)WebSocket的詳細教程

    Node.js實現(xiàn)WebSocket的詳細教程

    本文詳細介紹了如何在Node.js中使用ws庫和express框架實現(xiàn)WebSocket服務(wù)器,并涵蓋了項目結(jié)構(gòu)、代碼實現(xiàn)、運行方法、功能特點、性能優(yōu)化建議及安全注意事項,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • 使用Node.js寫一個代碼生成器的方法步驟

    使用Node.js寫一個代碼生成器的方法步驟

    這篇文章主要介紹了使用 Node.js 寫一個代碼生成器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Node.JS中快速掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的Web服務(wù)器地址(80)

    Node.JS中快速掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的Web服務(wù)器地址(80)

    在 Node.JS 中進行端口掃描還是比較方便的,一般會有廣播和輪詢兩種方式。下文重點給大家介紹node.js 掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的web服務(wù)器地址的方法,一起看看吧
    2017-09-09

最新評論

自治县| 黄石市| 淅川县| 北海市| 察隅县| 海淀区| 海原县| 巴青县| 丰都县| 博爱县| 柳河县| 麻阳| 田林县| 乐陵市| 福建省| 花莲县| 蓬安县| 泗洪县| 鄂托克旗| 青铜峡市| 岳阳县| 东乌珠穆沁旗| 安阳市| 宜兰市| 襄城县| 哈密市| 安义县| 息烽县| 隆尧县| 巢湖市| 巧家县| 永年县| 嵊泗县| 永兴县| 察雅县| 尚义县| 凤台县| 南江县| 赤城县| 平顺县| 兖州市|