节点使用WriteStream附加到某个位置的文件

时间:2014-10-20 00:41:40

标签: javascript node.js fs

我正在开发一个小项目,我将大量数据写入文件(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不接受结束位置。

还有可能有更好的方法来做我想做的事情吗?

感谢您的帮助。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是一个可能的替代方案:只保留一个包含换行符分隔的JSON对象的文件。这样你就可以像fs.appendFileSync('foo', JSON.stringify(obj) + '\n');那样添加新记录。

然后,当你想要阅读整个(甚至部分)内容时,只需做一些事情(你可以轻松地做同样的异步):

var data = JSON.parse('[' + fs.readFileSync('foo', 'utf8').replace(/\n/g, ',') + ']');