Java InputStream到ByteBuffer

ele*_*ect 23 java bytebuffer inputstream

我读DDS纹理,但由于一次建成罐子我无法通过访问这些纹理urlfile并有能力使用InputStream来代替.

所以我需要知道如何java.?nio.ByteBuffer从一个人那里获得一个java.io.InputStream.

Ps:无论通过第三方库,我只需要它工作

Jor*_*lla 37

对我来说,在这种情况下最好的是Apache commons-io来处理这个和类似的任务.

IOUtils类型有一个静态方法来读取InputStream和返回a byte[].

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);
Run Code Online (Sandbox Code Playgroud)

在内部,这会创建一个ByteArrayOutputStream并将字节复制到输出,然后调用toByteArray().

更新:只要你有byte array,如@Peter指出,你必须转换为ByteBuffer

ByteBuffer.wrap(bytes)
Run Code Online (Sandbox Code Playgroud)

JAVA 9更新:正如@ saka1029所述,如果您使用的是java 9+,您可以使用InputStream现在包含InputStream::readAllBytes函数的默认API ,因此不需要外部库

InputStream is;
byte[] bytes = is.readAllBytes()
Run Code Online (Sandbox Code Playgroud)

  • 您可以在Java 9中执行`byte [] bytes = is.readAllBytes()`. (4认同)
  • 再到ByteBuffer? (3认同)
  • 它可能内存不足 (3认同)
  • @elect yes,`ByteBuffer.wrap(bytes)` (2认同)
  • @chen 可能会 OOM。此方法仅适用于小文件。这就是为什么人们发明了 InputStream API :-) >> 以流的形式读取某些内容(一段接着一段)。 (2认同)

小智 5

什么意思:

ReadableByteChannel channel = Channels.newChannel(inputStream);
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);

while (channel.read(buffer) != -1) {
  //write buffer

};
Run Code Online (Sandbox Code Playgroud)