使用Node.js流读取二进制数据

7

我正在尝试使用fs createReadStream读取二进制文件。假设我们知道binarylatin1作为encoding选项的值所产生的误解,并且默认情况下在data块上使用toString将使用utf-8,我已经尝试使用Buffer和缓冲区连接即.concat函数的方式:

var readStream = fs.createReadStream( graphPath );
                        var data;
                        readStream.on('data', (chunk) => {
                            var b = new Buffer (chunk.length);
                            if(!data) data = new Buffer (chunk.length);
                            else data = Buffer.concat([data, b]);
                        })  
                        readStream.on('end', () => {
                            console.log( "type is", typeof (data ) );
                            console.log("read graph %d",data.length);data.buffer);
                        });

为了将新的块附加到数据中,可以这样做。这种情况下,data 中的 typeof 对象是 object,但似乎它的编码仍然不是二进制格式(即它的内容类型不是 application/octet-stream charset=binary,在内容类型方面需要明确)。

如果只执行 data+=chunk,输出类型将会是 string

1个回答

7
如果文件中的数据已经使用 'binary' 编码,那么请使用setEncoding()readStream 编码设置为 'binary',并将所有块连接成一个字符串返回。 setEncoding() 支持Node实现的任何编码,详见Buffer对编码的文档说明。
const getBinary = (graphPath, asBuffer = false, cb) => {
  let readStream = fs.createReadStream(graphPath)
  let data = ''

  // set stream encoding to binary so chunks are kept in binary
  readStream.setEncoding('binary')
  readStream.once('error', err => {
    return cb(err)
  })
  readStream.on('data', chunk => (data += chunk))
  readStream.on('end', () => {
    // If you need the binary data as a Buffer
    // create one from data chunks       
    return cb(null, asBuffer ? Buffer.from(data, 'binary') : data)
  })
}

谢谢,输入文件是一个二进制文件。接受数据作为输入的API方法应该加载一个字节数组:public void importGraphDef(byte[] graphDef) throws IllegalArgumentException(这是API签名)。你的代码是正确的,但由于某种原因,该方法抛出了一个IllegalArgumentException错误,就像从cb传递的数据是一个嵌套对象一样。我已经使用了getBinary(graphPath,true,(error,graphDef) => graph.importGraphDef(graphDef));,我必须使用asBuffer=true,因为它不期望一个字符串... - loretoparisi
@loretoparisi,如果您始终需要缓冲区,则只需在返回cb和asBuffer标志中删除条件。因此,您的“end”处理程序将类似于readStream.on('end',()=> {return cb(null,Buffer.from(data,'binary')}),而getBinary()签名将是let getBinary =(graphPath,cb)= > {} - peteb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接