4

我想做类似的事情:

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

但这失败了,因为它试图读取和写入相同的目的地。有一些方法可以解决它,比如只outputend上面的回调中进行管道传输。

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

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

1 回答 1

1

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

在您的示例中,您应该读取文件,然后对其进行解析和转换,然后将结果写入文件;尽管您不应该使用函数的同步版本,但请参阅Node.js 文档本段的末尾

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


无论如何,我认为您在覆盖文件时无法读取文件。请参阅此针对同一问题的特定答案。

于 2013-11-15T20:20:44.903 回答