Node JS - 如何将流大json数据写入json数组文件?

时间:2016-12-13 15:46:18

标签: javascript json node.js

我很难使用stream模块将json数据写入json文件。 我从几个博客教程中了解到这一点,其中一个是page

假设我正在处理json文件中的大json数据。我认为不可能将所有json对象存储在我的内存中。所以我决定使用流模块。

这里是我所做的代码:

writeStream.js

var Writable = require('stream').Writable,
util = require('util');

var WriteStream = function() {
    Writable.call(this, {
        objectMode: true
    });
};

util.inherits(WriteStream, Writable);

WriteStream.prototype._write = function(chunk, encoding, callback) {
    console.log('write            : ' + JSON.stringify(chunk));
    callback();
};

module.exports = WriteStream;

readStream.js

var data = require('./test_data.json'),
Readable = require('stream').Readable,
util = require('util');

var ReadStream = function() {
    Readable.call(this, {
        objectMode: true
    });

    this.data = data;
    this.curIndex = 0;
};

util.inherits(ReadStream, Readable);

ReadStream.prototype._read = function() {
    if (this.curIndex === this.data.length) {
        return this.push(null);
    }

    var data = this.data[this.curIndex++];
    console.log('read             : ' + JSON.stringify(data));
    this.push(data);
};

module.exports = ReadStream;

使用此代码调用:

var ReadStream = require('./readStream.js'),
WriteStream = require('./writeStream.js');

var rs = new ReadStream();
var ws = new WriteStream();
rs.pipe(ws);

问题:我想把它写入不同的文件,怎么可能? 你能帮我吗?

1 个答案:

答案 0 :(得分:5)

如果您正在寻找仅将ReadStream中的数据写入其他文件的解决方案,可以尝试fs.createWriteStream。它会返回一个可写的流,可以直接通过管道传输到ReadStream

您必须对 readStream.js 进行细微更改。您当前正在推送一个对象,从而使其成为一个对象流,而写入流需要String或Buffer,除非在ObjectMode中启动。因此,您可以执行以下操作之一:

  • 以对象模式启动写入流。更多信息here
  • 在读取流中推送字符串或缓冲区,因为可写流在内部调用writable.write,它需要String或Buffer。更多信息here

如果我们按照第二个选项作为示例,那么 readStream.js 应该如下所示:

var data = require('./test_data.json'),
Readable = require('stream').Readable,
util = require('util');

var ReadStream = function() {
    Readable.call(this, {
        objectMode: true
    });

    this.data = data;
    this.curIndex = 0;
};

util.inherits(ReadStream, Readable);

ReadStream.prototype._read = function() {
    if (this.curIndex === this.data.length) {
        return this.push(null);
    }

    var data = this.data[this.curIndex++];
    console.log('read             : ' + JSON.stringify(data));
    this.push(JSON.stringify(data));
};

module.exports = ReadStream;

您可以使用以下代码调用上述代码

var ReadStream = require('./readStream.js');
const fs = require('fs');

var rs = new ReadStream();
const file = fs.createWriteStream('/path/to/output/file');
rs.pipe(file);

这会将test_data.json中的数据写入输出文件。

此外,作为一种良好做法并可靠地检测写入错误,请为“错误”事件添加一个侦听器。对于上面的代码,您可以添加以下内容:

file.on('error',function(err){
  console.log("err:", err);
});

希望这有帮助。