我想做这样的事情:
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');
您的代码没有其他方法可以使用less内存,因为您需要整个文件才能将其解析为 Javascript 对象。这样,两个版本的代码在内存方面是等效的。如果您无需处理完整的 JSON 对象就可以完成一些工作,请查看JSON流 https://github.com/dominictarr/JSONStream.
在你的例子中,你should读取文件,然后对其进行解析和转换,然后将结果写入文件;尽管您不应该使用函数的同步版本,但请参阅Node.js 文档本段的末尾 http://nodejs.org/api/fs.html#fs_file_system:
在繁忙的进程中,强烈鼓励程序员使用这些调用的异步版本。同步版本将阻止整个过程,直到完成为止——停止所有连接。
无论如何,我认为您在覆盖文件时无法读取文件。看这个特定的答案 https://stackoverflow.com/a/10586706/2137601同样的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)