Java InputStream 到 ByteBuffer
Java InputStream to ByteBuffer
我正在阅读 dds 纹理,但是自从构建了 jar 之后,我就无法通过 url
和 file
访问这些纹理,而必须改用 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);
我正在阅读 dds 纹理,但是自从构建了 jar 之后,我就无法通过 url
和 file
访问这些纹理,而必须改用 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);