我正在阅读dds纹理,但是一旦构建了jar文件后,我就无法通过url
和file
访问这些纹理,必须使用InputStream
代替。
因此,我需要知道如何从java.io.InputStream
获取java.nio.ByteBuffer
。
注:无论通过第三方库还是其他方式,只需确保其可用即可。
我正在阅读dds纹理,但是一旦构建了jar文件后,我就无法通过url
和file
访问这些纹理,必须使用InputStream
代替。
因此,我需要知道如何从java.io.InputStream
获取java.nio.ByteBuffer
。
注:无论通过第三方库还是其他方式,只需确保其可用即可。
对我来说,在这种情况下最好使用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,该 API 现在包含 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
};
read()
在输入流结束时返回 -1 吗?有时它会返回 0。 - happy_marmosetSocketChannel
读取,则返回0。 - undefinedcompact()
的作用。 - undefinedcompact()
可能不适用。 - undefinedByteBuffer byteBuffer = ByteBuffer.allocate(inputStream.available());
Channels.newChannel(inputStream).read(byteBuffer);
read()
就能读取所有输入流吗? - happy_marmosetInputStream.available()
的方式,而且 Javadoc 上明确指出了这一点。它不会返回流中的总字节数,并且可能返回零。 - undefinedjava.io.InputStream
中)返回一个字节数组。你可以将该字节数组传递给[静态]方法wrap(在类java.nio.ByteBuffer
中),例如:public ByteBuffer fromInputStrem(InputStream is) throws IOException {
return ByteBuffer.wrap(is.readAllBytes());
}
ByteBuffer.wrap(bytes)
- Peter Lawrey