web-dev-qa-db-ja.com

NodeJを使用してファイル全体をメモリにバッファリングする

私は、コードの実行全体に直接アクセスするためにメモリに入れたい比較的小さなファイル(数百キロバイト)を持っています。

NodeJの内部が正確にわからないので、fs openで十分か、すべてのファイルを読み取ってBufferにコピーする必要がありますか?

28
Leonardo Rossi

基本的に、readFileモジュールのreadFileSyncまたはfs関数を使用する必要があります。指定されたファイルの完全なコンテンツを返しますが、動作が異なります(非同期と同期)。

Node.jsのブロック(アプリケーションの起動時など)が問題にならない場合は、次のように簡単な同期バージョンを使用できます。

var fs = require('fs');

var data = fs.readFileSync('/etc/passwd');

非同期にする必要がある場合、コードは次のようになります。

var fs = require('fs');

fs.readFile('/etc/passwd', function (err, data ) {
  // ...
});

いずれの場合でも、2番目のパラメーターとしてoptionsオブジェクトを指定できることに注意してください。使用するエンコードを指定します。エンコーディングを省略すると、生のバッファが返されます:

var fs = require('fs');

fs.readFile('/etc/passwd', { encoding: 'utf8' }, function (err, data ) {
  // ...
});

有効なエンコードはutf8asciiutf16leucs2base64およびhexbinaryエンコーディングもありますが、これは非推奨であり、今後使用しないでください。適切な documentation でエンコーディングとバッファの処理方法の詳細を見つけることができます。

57
Golo Roden

簡単

var buffer = fs.readFileSync(filename);
11
vkurchatkin

Node 0.12を使用すると、これを同期的に実行できるようになりました。

  var fs = require('fs');
  var path = require('path');

  // Buffer mydata
  var BUFFER = bufferFile('../public/mydata');

  function bufferFile(relPath) {
    return fs.readFileSync(path.join(__dirname, relPath)); // zzzz....
  }

fsはファイルシステムです。 readFileSync() は、バッファ、または要求した場合は文字列を返します。

fsは、相対パスがセキュリティ上の問題であると正しく想定しています。 pathは回避策です。

文字列としてロードするには、エンコードを指定します。

return readFileSync(path,{ encoding: 'utf8' });
7
Michael Cole