节点的JS – 如何将stream大JSON数据写入JSON数组文件?

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

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

这里我所做的代码:

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

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

如果您正在寻找解决scheme,只需将ReadStream的数据写入其他文件,则可以尝试使用fs.createWriteStream 。 它会返回一个可写的stream,可以直接传送给你的ReadStream

您将不得不在readStream.js中做一些小改动。 您正在推送一个对象,从而使其成为一个对象stream,而写入stream需要String或Buffer,除非在ObjectMode中启动。 所以你可以做以下的一个:

  • 以对象模式启动写入stream。 更多信息在这里 。
  • 将读取stream中的string或缓冲区作为可写入stream在内部调用writable.write,该string需要string或缓冲区。 更多信息在这里 。

如果我们按照第二个选项作为例子,那么你的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); }); 

希望这可以帮助。