我的应用程序获取了大量的大型InputStream,需要将它们交给期望ByteBuffers的驱动程序。 Java InputStream to ByteBuffer建议先将它们转换为字节数组;然而,这是昂贵的,并且确实破坏了使用NIO的全部意义。我正在寻找一种方法,希望ByteBuffer的驱动程序可以根据需要从InputStream读取。
在我正在处理的情况下,立即使用整个InputStream并将其转换为数组太昂贵且浪费。
答案 0 :(得分:2)
如果不首先阅读整个InputStream
,你几乎不可能做到这一点。
ByteBuffer
API是随机访问,而InputStream
是严格顺序的。
此外,您不能创建自己的ByteBuffer
子类,因为它的构造函数是包私有的,而java.nio
包是受限制的。也就是说,您无法将InputStream
打包成ByteBuffer
;您必须使用ByteBuffer.wrap(byte[])
或ByteBuffer.allocateDirect()
。
答案 1 :(得分:0)
我不认为这是可能的。无论你是使用ByteBuffer还是只是从InputStream读取,你最终都使用的是由某人创建的字节数组。现在,当您将字节数组传递给Buffer时,Buffer没有初始化一个新的字节数组,它正在重用您实际传递的内容。这个片段是直接从Java 8源代码中直接看到的:
ByteBuffer(int mark, int pos, int lim, int cap, // package-private
274 byte[] hb, int offset)
275 {
276 super(mark, pos, lim, cap);
277 this.hb = hb;
278 this.offset = offset;
279 }
正如你在上面的片段中看到的那样,ByteBuffer直接使用字节数组,它没有再次处理它。所以你读了一个字节数组会有0的惩罚。你不应该害怕应用你在实践中链接的帖子。没有性能损失。