一尘不染

node.js中fs.createReadStream与fs.readFile的优缺点是什么?

node.js

我正在弄乱node.js,发现了两种读取文件并通过有线方式发送文件的方法,一旦我确定它存在并使用writeHead发送正确的MIME类型:

// read the entire file into memory and then spit it out

fs.readFile(filename, function(err, data){
  if (err) throw err;
  response.write(data, 'utf8');
  response.end();
});

// read and pass the file as a stream of chunks

fs.createReadStream(filename, {
  'flags': 'r',
  'encoding': 'binary',
  'mode': 0666,
  'bufferSize': 4 * 1024
}).addListener( "data", function(chunk) {
  response.write(chunk, 'binary');
}).addListener( "close",function() {
  response.end();
});

如果所讨论的文件很大,例如视频,fs.createReadStream可能会提供更好的用户体验,我是否正确?感觉好像不那么块状。这是真的?我还需要了解其他优点,缺点,警告或陷阱吗?


阅读 647

收藏
2020-07-07

共1个答案

一尘不染

如果您只是将“数据”连接到“ write()”,将“关闭”连接到“ end()”,则是一种更好的方法:

// 0.3.x style
fs.createReadStream(filename, {
  'bufferSize': 4 * 1024
}).pipe(response)

// 0.2.x style
sys.pump(fs.createReadStream(filename, {
  'bufferSize': 4 * 1024
}), response)

read.pipe(write)或” sys.pump(read, write)方法的好处还在于增加了流量控制。因此,如果写入流不能尽快接受数据,它将通知读取流回退,以最大程度地减少缓冲在内存中的数据量。

flags:"r"mode:0666由事实,这是一个暗示FileReadStream。该binary编码已过时-
如果没有指定编码,它会刚刚与原始数据缓冲区的工作。

此外,您还可以添加其他一些功能,使您的文件更加流畅:

  1. 嗅探req.headers.range并查看它是否匹配字符串/bytes=([0-9]+)-([0-9]+)/。如果是这样,您只想从该起点到终点流。(缺少数字表示0或“结尾”。)
  2. 将stat()调用中的inode和创建时间散列到ETag头中。如果您收到的请求标头具有“ if-none-match”匹配的标头,请发送回304 Not Modified
  3. 根据stat对象上的日期检查if-modified-since标题mtime。304(如果自提供日期以来未进行过修改)。

另外,通常,如果可以的话,发送Content-Length标题。(您正在stat-ing文件,因此您应该拥有此文件。)

2020-07-07