Node.js 使用nodejs就地流式传输和转换文件

Node.js 使用nodejs就地流式传输和转换文件,node.js,io,stream,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(c

我想做一些类似的事情:

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);
但这失败了,因为它试图读取和写入同一个目标。有很多方法可以绕过它,比如只通过管道从上面的
end
回调中导出
output

有更好的办法吗?所谓更好,我的意思是使用更少的代码或更少的内存。是的,我知道我可以做到:

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');

没有其他方法可以让代码使用更少的内存,因为需要将整个文件解析为Javascript对象。这样,两个版本的代码在内存方面是等效的。如果您可以在不必处理完整JSON对象的情况下完成一些工作,请查看

在您的示例中,您应该读取文件,然后对其进行解析和转换,然后将结果写入文件;尽管不应使用同步版本的函数,请参见:

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



无论如何,我不认为你可以在重写文件时读取它。请注意同样的问题。

虽然我同意应该避免使用同步版本,但在本例中,它们导致快速临时构建步骤(而不是长时间运行的服务器进程)的代码大大减少。谢谢你提供了bash答案的链接,这很有帮助!的确您能告诉我们输入文件的内容以及您希望实现的转换类型吗?没有这一点,很难知道算法是否可流化。内容是一个非常简单的JSON文件,
{“key”:“value”,“somekeytodelet”:{“yep”:“我不会在那里”}
,我只是从中删除了
somekeytodele
。我发现我可以使用流来覆盖我正在阅读的文件,但不可靠——有时它可以正常工作,而有时我会得到一个空文件。最好先写入一个临时文件,然后删除原始文件并在其上重命名临时文件。