java将InputStream呈现为ByteBuffer而不将整个事物加载到数组中

时间:2016-07-06 20:15:19

标签: java performance io

我的应用程序获取了大量的大型InputStream,需要将它们交给期望ByteBuffers的驱动程序。 Java InputStream to ByteBuffer建议先将它们转换为字节数组;然而,这是昂贵的,并且确实破坏了使用NIO的全部意义。我正在寻找一种方法,希望ByteBuffer的驱动程序可以根据需要从InputStream读取。

在我正在处理的情况下,立即使用整个InputStream并将其转换为数组太昂贵且浪费。

2 个答案:

答案 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的惩罚。你不应该害怕应用你在实践中链接的帖子。没有性能损失。