我正在尝试将字符串和可读流(可读流指向可能包含多个数据块的文件,即文件可能很大)连接到一个可写流中,以便可写流最终可以写到目的地。
我正在加密文件的字符串和内容,然后对它们应用zlib压缩,最后我想将它们传递给可写流。
为实现这一目标,我可以:
a)将文件内容转换为字符串然后连接字符串然后加密,进行压缩,然后最终将其传输到可写流中。但这是不可能的,因为文件的大小可能很大,因此我无法将其内容转换为字符串。
b)我可以先对字符串进行加密和压缩,然后将字符串转换为流,然后在完成后将其传输到可写流中,将文件内容传送到同一可写流中。
为此,我写了这个:
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
。第二个管道在输出目标上没有任何区别。起初,我认为原因可能是由于管道的异步行为。所以,出于这个原因,我在第一个管道关闭后管道文件内容。但是,我仍然没有得到理想的输出。
我想知道为什么会发生这种情况。
答案 0 :(得分:0)
找到可写流w
的第二个管道无法正常工作的原因。
当第一个.pipe(w)结束时,w处的可写也会自动关闭。
所以我应该使用s.pipe(zlib.createGzip()).pipe(w);
而不是s.pipe(zlib.createGzip()).pipe(w, {end: false});
。
array_splice( $array1, OFFSET, 1 );
将{end:false}作为第二个参数传递给pipe(),指出在管道完成时不应该关闭writeable。