【问题标题】:Write a brotli stream by chunks按块写一个brotli流
【发布时间】:2022-02-16 07:30:49
【问题描述】:

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

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?

【问题讨论】:

    标签: node.js stream compression


    【解决方案1】:

    解决办法是:

    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() 代替

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 2023-01-31
      • 2015-11-24
      • 2017-01-15
      • 2017-03-02
      • 2017-08-27
      • 2020-05-30
      相关资源
      最近更新 更多