我正在尝试使用fs createReadStream
读取二进制文件。假设我们知道binary
和latin1
作为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
。
二进制
文件。接受数据作为输入的API方法应该加载一个字节数组:public void importGraphDef(byte[] graphDef) throws IllegalArgumentException
(这是API签名)。你的代码是正确的,但由于某种原因,该方法抛出了一个IllegalArgumentException
错误,就像从cb
传递的数据是一个嵌套对象一样。我已经使用了getBinary(graphPath,true,(error,graphDef) => graph.importGraphDef(graphDef));
,我必须使用asBuffer=true
,因为它不期望一个字符串... - loretoparisiasBuffer
标志中删除条件。因此,您的“end”处理程序将类似于readStream.on('end',()=> {return cb(null,Buffer.from(data,'binary')})
,而getBinary()
签名将是let getBinary =(graphPath,cb)= > {}
。 - peteb