使用Node.js将整个文件缓存到内存中

66

我有一个相对较小的文件(几百千字节),我希望它在整个代码执行期间都可以在内存中进行直接访问。

我不太了解Node.js的内部机制,所以想问一下是否只需要使用fs open就可以,还是必须将所有文件读取并复制到Buffer中?


看一下readFile(),这就是你需要的。 - Gabriel Llamas
3个回答

99

基本上,您需要使用fs模块中的readFilereadFileSync函数。它们返回给定文件的完整内容,但在行为上有所不同(异步与同步)。

如果阻止Node.js(例如,在应用程序启动时)不是问题,则可以使用同步版本,如下所示:

var fs = require('fs');

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

如果你需要异步执行,代码如下:

var fs = require('fs');

fs.readFile('/etc/passwd', function (err, data ) {
  // ...
});
请注意,在任何情况下,您都可以提供一个options对象作为第二个参数,例如指定要使用的编码方式。如果省略编码方式,则返回原始缓冲区:

请注意,在任何情况下,您都可以提供一个options对象作为第二个参数,例如指定要使用的编码方式。如果省略编码方式,则返回原始缓冲区:

var fs = require('fs');

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

有效编码包括utf8asciiutf16leucs2base64hex。还有一种binary编码,但已被弃用,不应再使用。您可以在相应的文档中找到更多有关处理编码和缓冲区的详细信息。


1
readFile函数中有一个小错别字,编码后缺少逗号(我无法更正,因为编辑少于6个字符)。 - wi1

26

像......一样容易

var buffer = fs.readFileSync(filename);

17

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

1
有什么原因导致了负评? - Michael Cole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接