Буферизировать весь файл в памяти с помощью NodeJs

У меня есть сравнительно небольшой файл (несколько сотен килобайт), который я хочу быть в памяти для прямого доступа для всего выполнения кода.

Я не знаю точно, что внутри NodeJs, поэтому я спрашиваю, достаточно ли fs open, или я должен прочитать весь файл и скопировать на Buffer?

Ответы

Ответ 1

В принципе, вам нужно использовать функцию 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 ) {
  // ...
});

Обратите внимание, что в любом случае вы можете указать объект options в качестве второго параметра, например. для указания используемой кодировки. Если вы опускаете кодировку, возвращается необработанный буфер:

var fs = require('fs');

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

Действующие кодировки: utf8, ascii, utf16le, ucs2, base64 и hex. Существует также кодировка binary, но она устарела и больше не должна использоваться. Более подробную информацию о том, как обращаться с кодировками и буферами, можно найти в соответствующей документации.

Ответ 2

Так же легко, как

var buffer = fs.readFileSync(filename);

Ответ 3

С 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' });