Java 输入流到 ByteBuffer

问题描述 投票:0回答:4

我正在读取 dds 纹理,但自从构建了 jar 后,我无法通过

url
file
访问这些纹理,而必须使用
InputStream
来代替。

所以我需要知道如何从

java.​nio.ByteBuffer
获得
java.io.InputStream

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

java inputstream bytebuffer
4个回答
52
投票

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

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

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

在内部创建一个

ByteArrayOutputStream
并将字节复制到输出,然后调用
toByteArray()

更新:只要你有

byte array
,正如@Peter指出的那样,你就必须转换为
ByteBuffer

ByteBuffer.wrap(bytes)

JAVA 9更新:如@saka1029所述,如果您使用的是java 9+,您可以使用默认的

InputStream
API,它现在包含
InputStream::readAllBytes
功能,因此不需要外部库

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

3
投票

关于什么:

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

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

};

2
投票

无需第三方库的简洁解决方案是

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

参见 ReadableByteChannel#read(ByteBuffer)


0
投票

来自java 9

public ByteBuffer fromInputStrem(InputStream is) throws IOException {
    return ByteBuffer.wrap(is.readAllBytes());
}
© www.soinside.com 2019 - 2024. All rights reserved.