我想做点什么:
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');
答案 0 :(得分:1)
您的代码没有其他方式可以使用 less 内存,因为您需要将整个文件解析为Javascript对象。通过这种方式,您的代码的两个版本在内存方面都是等效的。如果您无需处理完整的JSON对象即可完成某些工作,请查看JSONStream。
在您的示例中,应该读取文件,然后解析并转换它,然后将结果写入文件;虽然您不应使用函数的同步版本,但请参阅the end of this paragraph of the Node.js documentation:
在繁忙的进程中,强烈建议程序员使用这些调用的异步版本。同步版本将阻止整个过程,直到它们完成 - 停止所有连接。
无论如何,我不认为你在覆盖它时可以从文件中读取。请参阅this particular answer同样的问题。