使用nodejs流式传输和转换文件

时间:2013-11-14 21:42:46

标签: node.js io stream

我想做点什么:

var fs = require('fs');
var through = require('through');

var file = 'path/to/file.json';

var input = fs.createReadStream(file, 'utf8');
var output = fs.createWriteStream(file, 'utf8');

var buf = '';
input
.pipe(through(function data(chunk) { buf += chunk; }, function end() {
  var data = JSON.parse(buf);
  // Do some transformation on the obj, and then...
  this.queue(JSON.stringify(data, null, ' '));
})
.pipe(output);

但这失败了,因为它试图读取和写入同一目的地。它有很多方法,比如只能在上面的output回调中加注end

有更好的方法吗?更好的是,我的意思是使用更少的代码或更少的内存。是的,我知道我可以这样做:

var fs = require('fs');
var file = 'path/to/file.json';

var str = fs.readFileSync(file, 'utf8');
var data = JSON.parse(str);    
// Do some transformation on the obj, and then...
fs.writeFileSync(file, JSON.stringify(data, null, '  '), 'utf8');

1 个答案:

答案 0 :(得分:1)

您的代码没有其他方式可以使用 less 内存,因为您需要将整个文件解析为Javascript对象。通过这种方式,您的代码的两个版本在内存方面都是等效的。如果您无需处理完整的JSON对象即可完成某些工作,请查看JSONStream

在您的示例中,应该读取文件,然后解析并转换它,然后将结果写入文件;虽然您不应使用函数的同步版本,但请参阅the end of this paragraph of the Node.js documentation

  

在繁忙的进程中,强烈建议程序员使用这些调用的异步版本。同步版本将阻止整个过程,直到它们完成 - 停止所有连接。


无论如何,我不认为你在覆盖它时可以从文件中读取。请参阅this particular answer同样的问题。