按块写一个brotli流



我正试图使用订阅通道,并通过附加消息将其写入压缩流:

import zlib from 'zlib'
import fs from 'fs'
const writeStream = fs.createWriteStream('test.br')
const brotli = zlib.createBrotliCompress()
const stream = brotli.pipe(writeStream)

stream.write('Hello ')
stream.write('world')
stream.close()

不幸的是,该文件是一个纯字符串,没有压缩。

我做错了什么?

另一方面,如果我从文件中读取或尝试以下操作,它会起作用:

import zlib from 'zlib'
import fs from 'fs'
import {Readable} from 'stream'

const writeStream = fs.createWriteStream('test.br')
const brotli = zlib.createBrotliCompress()
Readable.from('Hello World').pipe(brotli).pipe(writeStream)

但我失去了写大块的能力。

编辑:我成功了,但我不确定为什么:

import zlib from 'zlib'
import fs from 'fs'
import {PassThrough} from 'stream'
const writeStream = fs.createWriteStream('test.br')
const brotli = zlib.createBrotliCompress()
const dup = new PassThrough()
const pipedStream = dup.pipe(brotli).pipe(writeStream)
const finish = dup
finish.write('Hello ')
finish.write(' world')
finish.end()
  1. 为什么我需要Passthrough流而不是直接向brotli写入
  2. 为什么我需要写入双工流(dup(而不是pipedStream

解决方案是:

import zlib from 'zlib'
import fs from 'fs'
const writeStream = fs.createWriteStream('stream.br')
const brotli = zlib.createBrotliCompress()
brotli.pipe(writeStream)

brotli.write('Hello ')
brotli.write('world')
brotli.end()

close((终止流而不允许下属流消耗数据,应使用end((代替

最新更新