2017-10-19 72 views
0

我试图使用偏移量(位置)将字节缓冲区的内容写入文件。它的工作原理,当我转换为输入流,而不是当我在一个新的ByteBuffer包装将一个java.nio.ByteBuffer包装在一个新的实例中,用偏移量丢失字节

这工作:

new ByteArrayInputStream(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

这不

ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

更具体地讲,当我说它不起作用,将缓冲区的内容写入文件中:

Files.write(path, ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()).array())

结果字节写入文件,但它是不完整的,所以JPEG无法查看,但如果我写相同的缓冲区,在一个ByteArrayInputStream包装,它的工作:

val in = new ByteArrayInputStream(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 
Iterator.continually (in.read).takeWhile (-1 != _).foreach (fileOutputStream.write) 

所以我必须做一些愚蠢的事情,也许我不明白ByteBuffer如何工作

回答

1

ByteBuffer.wrap(byteBuffer.array(), <ANYTHING>, <ANYTHING>).array()意味着只是byteBuffer.array()<ANYTHING>没有考虑在内。

而且,整个

ByteBuffer.wrap(byteBuffer.array(), byteBuffer.position(), byteBuffer.array().length - byteBuffer.position()) 

只是创造byteBuffer浅拷贝一个麻烦的方式,你为什么这样做,而不是仅仅使用byteBuffer本身?

看起来你想要的东西是一样的东西

try (FileChannel outCh = new FileOutputStream(filename).getChannel()) { 
    outCh.write(byteBuffer); 
} 
+0

你的建议的作品,但我还是好奇如何使它的东西,如Files.write,这需要一个字节数组工作。我正在使用的某些apis只需要一个字节数组 – Andrew

+0

您必须手动复制数组的正确部分,请参阅这里https://stackoverflow.com/a/679325/2369544。还有一个建议,它有点与ByteBuffer背后的哲学相矛盾,你应该只作为最后的手段:https://stackoverflow.com/a/679335/2369544。 – starikoff

相关问题