java 将输入流呈现为字节缓冲区,而不将整个内容加载到数组中

SRo*_*mes 5 java io performance

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

在我正在处理的情况下,一次消耗整个 InputStream 并将其转换为数组过于昂贵且浪费。

Ale*_*rov 1

我认为这是不可能的。无论您使用 ByteBuffer 还是只是从 InputStream 读取,最终您都会使用由某人创建的字节数组。现在,当您将字节数组传递给缓冲区时,缓冲区不会初始化新的字节数组,而是重用您实际传递的内容。该片段直接取自 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     }
Run Code Online (Sandbox Code Playgroud)

正如您在上面的片段中看到的,ByteBuffer 直接使用字节数组,它不会再次处理它。因此,对于您已读取字节数组的事实,惩罚为 0。您不应该害怕在实践中应用您链接的帖子。不会有任何性能损失。