【发布时间】:2015-07-13 14:21:54
【问题描述】:
我正在阅读 dds 纹理,但是自从构建了 jar 后,我无法通过 url 和 file 访问这些纹理,而必须使用 InputStream。
所以我需要知道如何从java.io.InputStream 获取java.nio.ByteBuffer。
Ps:无论通过第三部分库,我只需要它工作
【问题讨论】:
标签: java inputstream bytebuffer
我正在阅读 dds 纹理,但是自从构建了 jar 后,我无法通过 url 和 file 访问这些纹理,而必须使用 InputStream。
所以我需要知道如何从java.io.InputStream 获取java.nio.ByteBuffer。
Ps:无论通过第三部分库,我只需要它工作
【问题讨论】:
标签: java inputstream 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()
【讨论】:
ByteBuffer.wrap(bytes)
不需要 3rd 方库的简洁解决方案是
ByteBuffer byteBuffer = ByteBuffer.allocate(inputStream.available());
Channels.newChannel(inputStream).read(byteBuffer);
【讨论】:
read()足以读取所有输入流吗?
InputStream。如果它有所有可用的字节,那么它将工作。
关于:
ReadableByteChannel channel = Channels.newChannel(inputStream);
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
while (channel.read(buffer) != -1) {
//write buffer
};
【讨论】:
read() 在输入流结束时返回-1 吗?有时它会返回 0。
Returns: The number of bytes read, possibly zero, or -1 if the channel has reached end-of-stream