我正在开发一个小项目,我将大量数据写入文件(10 + mb,好吧,不是那么多)。我想在每次获取数据时写入我的输出,包括我的程序崩溃或其他什么,我不想将我的数据保存在内存中然后在完成后写入。
我的问题是我想每次都写入我文件中的特定位置,例如我想写一个有效的JSON结构。 IE我从包含数组'[]'的文件开始,每当我获取数据时,我想在我的文件中将对象追加到该数组中,所以现在我想在我的文件中添加'[{something:'great'}]'。下次我写作时我想要'[{somethingElse:'yes'},{something:'great'}]'。
所以每当我想将一些数据附加到文件中的某个位置时,我可以每秒写10到50次。
我正在尝试使用fs.createWriteStream执行此操作,但每次指定起始位置时,我都会遇到一些随机编码问题,而且我无法分辨出发生了什么。如果我没有指定开始并且编码没有弄乱,这可以正常工作,但它当然不会以正确的文件结束。
这是我的基本代码
function JSONOutputFormatter (outputFileName, counter) {
var counter = counter,
outputFileName = outputFileName,
options = { encoding : 'utf8', start : Buffer.byteLength('[', 'utf8'), flags: 'a'},
writeStream = fs.createWriteStream(outputFileName + '.json', options);
var appendToFile = function (toAppend) {
writeStream.write(toAppend);
};
return {
open : function () {
fs.appendFileSync(outputFileName + '.json', '[]');
},
append : function (data) {
appendToFile(JSON.stringify(data));
},
close : function () {
writeStream.end();
}
};
}
我的问题是,无论何时添加数据,我都会失去结束']'。
所以我的问题是o我需要指定每次写入的结束选项位置,IE我写的数据的字节长度?如果有更好的方法,那么每次都创建一个新的WriteStream,write不接受结束位置。
还有可能有更好的方法来做我想做的事情吗?
感谢您的帮助。
提前感谢您的帮助。
答案 0 :(得分:0)
这是一个可能的替代方案:只保留一个包含换行符分隔的JSON对象的文件。这样你就可以像fs.appendFileSync('foo', JSON.stringify(obj) + '\n');
那样添加新记录。
然后,当你想要阅读整个(甚至部分)内容时,只需做一些事情(你可以轻松地做同样的异步):
var data = JSON.parse('[' + fs.readFileSync('foo', 'utf8').replace(/\n/g, ',') + ']');