读取并处理节点中双工流中的较小块



我需要获取一个20Mb json对象数组的序列,管道传输到一个流中,分成33个项目的较小数组,将其转换为html,然后管道传输到另一个流(用于pdf转换)。

问题是,我还不太了解节点流是如何工作的。我正试图使用Duplex流来解决这个问题,但我不知道如何将来自上层流的传入块集中起来,并将它们分部分发送到下层流。在这个代码

jsonReader = fs.createReadStream 'source.json'
class Convert extends Duplex
    constructor: ->
        super readableObjectMode: true
        # Duplex.call @, readableObjectMode: true
        @buffer = []
    _read: (lines) ->
        console.log "buffer #{@buffer.length}"
        if @buffer.length is 0
            @push null
        else 
            console.log "lines: #{lines}"
            page = @buffer.slice 0, 33
            console.log page.length
            @buffer.splice 0, 33
            @push page
    _write: (data, enconding, next) ->
        @buffer.push data
        next()
convert = new Convert()
jsonReader.pipe(convert).pipe(process.stdout)

@缓冲区总是空的。node将从上层流传入的块存储在哪里?

您在_write中接收的data是一个缓冲区,是输入文件的二进制部分,您不会接收对象甚至字符串。你可以手动解析块来检索你的对象,或者你可以在内存中加载整个文件(20Mb不是那么大)并解析它

es = require('event-stream')
convert = (path) ->
    # load and parse your file
    content = JSON.parse fs.readFileSync(path, 'utf8')
    es.readable (count, next) ->
        # emit 33 elements at a time until content.length === 0
        while content.length
            this.emit 'data', content.splice(0, 33)
        # close the stream
        this.emit 'end'
        next()
srcPath = __dirname + '/source.json'
# convert is a stream
convert(srcPath)
    # piping to console.log because process.stdout can't handle objects
    .pipe(es.map (arr, next) ->
        console.log arr
        next()
    )

相关内容

  • 没有找到相关文章