【发布时间】:2018-03-12 06:56:52
【问题描述】:
我正在尝试将一个字符串和一个可读流(可读流指向一个文件,该文件可能包含多个块中的数据,即文件可能很大)连接到一个可写流中,以便可写流最终可以写入目的地。
我正在加密文件的字符串和内容,然后对它们应用 zlib 压缩,最后我想将它们通过管道传输到可写流。
为此,我可以:
a) 将文件内容转换为字符串,然后连接两个字符串,然后加密、压缩,最后通过管道将其传输到可写流中。但这是不可能的,因为文件可能很大,因此我无法将其内容转换为字符串。
为此,我写了这个:
var crypto = require('crypto'),
algorithm = 'aes-256-ctr',
password = 'd6FAjkdlfAjk';
var stream = require('stream');
var fs = require('fs');
var zlib = require('zlib');
// input file
var r = fs.createReadStream('file.txt');
// zip content
var zip = zlib.createGzip();
// encrypt content
var encrypt = crypto.createCipheriv(algorithm, password, iv);
var w = fs.createWriteStream('file.out');
// the string contents are being converted into a stream so that they can be piped
var Readable = stream.Readable;
var s = new Readable();
s._read = function noop() {};
s.push(hexiv+':');
s.push(null);
s.pipe(zlib.createGzip()).pipe(w);
// start pipe when 'end' event is encountered
s.on('end', function(){
r.pipe(zip).pipe(encrypt).pipe(w);
});
我观察到的是:
只有第一个管道成功完成,即字符串写入file.out。第二个管道对输出目标没有任何影响。起初,我认为原因可能是由于管道的异步行为。因此,出于这个原因,我在第一个管道关闭后对文件内容进行管道传输。但是,我仍然没有得到想要的输出。
我想知道为什么会发生这种情况。
【问题讨论】:
-
您指的是哪个
.pipe()电话?在end事件中? -
在
zip已定义的情况下调用s.pipe(zlib.createGzip()).pipe(w);的目的是什么? -
@guest271314 在
end事件中,r是指向我要读取的文件的可读流。而w是指向目标文件的可写流。 -
@guest271314 ,是的,我应该使用
zip而不是zlib.createGzip(),但这不会对流的管道产生任何影响。 -
没试过node.js流实现。是否使用本机
ReadableStream和WritableStream选项?encrypt是什么?您是否尝试将错误事件处理程序附加到过程?仍然不确定为什么.createGzip()被调用两次?hexiv定义在哪里?
标签: javascript node.js string stream pipe