Java InputStream 到 ByteBuffer

Java InputStream to ByteBuffer

我正在阅读 dds 纹理,但是自从构建了 jar 之后,我就无法通过 urlfile 访问这些纹理,而必须改用 InputStream

所以我需要知道如何从 java.io.InputStream 获得 java.​nio.ByteBuffer

Ps: 无论通过第 3 部分库,我只需要它工作

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

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

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);

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

UPDATE:只要你有 byte array,正如 @Peter 指出的那样,你必须转换为 ByteBuffer

ByteBuffer.wrap(bytes)

JAVA 9 更新:如@saka1029 if you're using java 9+ you can use the default InputStream API which now includes InputStream::readAllBytes 函数所述,因此不需要外部库

InputStream is;
byte[] bytes = is.readAllBytes()

关于什么:

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

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

};

不需要第 3 方库的简洁解决方案是

ByteBuffer byteBuffer = ByteBuffer.allocate(inputStream.available());
Channels.newChannel(inputStream).read(byteBuffer);

ReadableByteChannel#read(ByteBuffer)