使用 Node.js 在内存中缓冲整个文件

Posted

技术标签:

【中文标题】使用 Node.js 在内存中缓冲整个文件【英文标题】:Buffer entire file in memory with Node.js 【发布时间】:2013-11-11 10:14:25 【问题描述】:

我有一个相对较小的文件(大约数百 KB),我想将它放在内存中,以便在整个代码执行过程中直接访问。

我并不确切知道 Node.js 的内部结构,所以我问fs open 是否足够,或者我必须读取所有文件并复制到Buffer

【问题讨论】:

看readFile(),这是你需要的。 【参考方案1】:

基本上,您需要使用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 对象作为第二个参数,例如指定要使用的编码。如果省略编码,则返回原始缓冲区:

var fs = require('fs');

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

有效编码为utf8asciiutf16leucs2base64hex。还有一个binary 编码,但它已被弃用,不应再使用。您可以在相应的documentation 中找到有关如何处理编码和缓冲区的更多详细信息。

【讨论】:

小错字,在 readFile 函数中编码后缺少逗号(我无法更正,因为编辑少于 6 个字符)【参考方案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() 返回一个 Buffer 或字符串,如果你问的话。

fs 正确假设相对路径是一个安全问题。 path 是一种解决方法。

要作为字符串加载,请指定编码:

return readFileSync(path, encoding: 'utf8' );

【讨论】:

down-mod 有什么原因吗?

以上是关于使用 Node.js 在内存中缓冲整个文件的主要内容,如果未能解决你的问题,请参考以下文章

将文件解压缩到内存中,调整文件,压缩并流式传输到客户端(Node.js)

Node.js Buffer(缓冲区)

Node.js Buffer(缓冲区)

如何使用sharp.js将图像从缓冲区存储到node.js中的文件系统

Node.js:Buffer(缓冲区)介绍及常用方法

在 Node.js 中编写文件