我正在读取 dds 纹理,但自从构建了 jar 后,我无法通过
url
和 file
访问这些纹理,而必须使用 InputStream
来代替。
所以我需要知道如何从
java.nio.ByteBuffer
获得 java.io.InputStream
。
Ps:无论通过第三部分库,我只需要它工作
对我来说,这种情况下最好的是 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()
关于什么:
ReadableByteChannel channel = Channels.newChannel(inputStream);
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
while (channel.read(buffer) != -1) {
//write buffer
};
无需第三方库的简洁解决方案是
ByteBuffer byteBuffer = ByteBuffer.allocate(inputStream.available());
Channels.newChannel(inputStream).read(byteBuffer);
来自java 9
public ByteBuffer fromInputStrem(InputStream is) throws IOException {
return ByteBuffer.wrap(is.readAllBytes());
}