我很难使用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);
问题:我想把它写入不同的文件,怎么可能? 你能帮我吗?
答案 0 :(得分:5)
如果您正在寻找仅将ReadStream
中的数据写入其他文件的解决方案,可以尝试fs.createWriteStream。它会返回一个可写的流,可以直接通过管道传输到ReadStream
。
您必须对 readStream.js 进行细微更改。您当前正在推送一个对象,从而使其成为一个对象流,而写入流需要String或Buffer,除非在ObjectMode中启动。因此,您可以执行以下操作之一:
如果我们按照第二个选项作为示例,那么 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);
});
希望这有帮助。