web-dev-qa-db-fra.com

Mettre le fichier entier en mémoire tampon avec NodeJs

J'ai un fichier relativement petit (quelques centaines de kilo-octets) que je veux être en mémoire pour un accès direct pour toute l'exécution du code.

Je ne connais pas exactement les internes de NodeJs, donc je demande si un fs open suffit ou je dois lire tous les fichiers et les copier dans un Buffer?

28
Leonardo Rossi

Fondamentalement, vous devez utiliser la fonction readFile ou readFileSync du module fs. Ils renvoient le contenu complet du fichier donné, mais diffèrent dans leur comportement (asynchrone contre synchrone).

Si le blocage de Node.js (par exemple au démarrage de votre application) n'est pas un problème, vous pouvez opter pour la version synchronisée, ce qui est aussi simple que:

var fs = require('fs');

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

Si vous devez devenir asynchrone, le code est comme ça:

var fs = require('fs');

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

Veuillez noter que dans les deux cas, vous pouvez donner un objet options comme deuxième paramètre, par ex. pour spécifier l'encodage à utiliser. Si vous omettez l'encodage, le tampon brut est retourné:

var fs = require('fs');

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

Les encodages valides sont utf8, ascii, utf16le, ucs2, base64 et hex. Il existe également un codage binary, mais il est obsolète et ne devrait plus être utilisé. Vous pouvez trouver plus de détails sur la façon de gérer les encodages et les tampons dans la documentation appropriée .

57
Golo Roden

Aussi facile que

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

Avec Node 0.12, il est possible de le faire de manière synchrone maintenant:

  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 est le système de fichiers. readFileSync () renvoie un tampon ou une chaîne si vous le demandez.

fs suppose correctement que les chemins relatifs sont un problème de sécurité. path est une solution de contournement.

Pour charger en tant que chaîne, spécifiez l'encodage:

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