【发布时间】:2020-08-08 20:27:41
【问题描述】:
我想将从一个简单的 .txt 文件创建的 readStream 分叉为 3 个压缩流(gzip、brotli 和 deflate),以便计算每个文件压缩所花费的时间。我当前的代码如下所示:
import {createReadStream, createWriteStream} from 'fs';
import zlib from 'zlib';
const main = () => {
const filename = 'file.txt';
const fileStream = createReadStream(filename);
const compressions = {
createGzip: 'gz',
createBrotliCompress: 'br',
createDeflate: 'deflate'
};
let {length} = Object.keys(compressions);
const timings = {};
for (const [module, ext] of Object.entries(compressions)) {
timings[module] = Date.now();
fileStream
.pipe(zlib[module]())
.pipe(createWriteStream(`${filename}.${ext}`))
.on('finish', () => {
timings[module] = `it took ${Date.now()-timings[module]}ms`;
if (!--length)
console.log(timings);
});
}
};
main();
但是,当我运行脚本时,每次压缩的结果总是大致相同,这意味着必须在 fileStream 本身关闭时触发“完成”事件,而不是针对每个压缩写入流。我该如何正确实施呢?
{
createGzip: 'it took 3161ms',
createBrotliCompress: 'it took 3169ms',
createDeflate: 'it took 3155ms'
}
【问题讨论】: