我知道 如何获取给定类路径资源的输入流,从输入流读取直到我到达终点,但它看起来像一个非常常见的问题,并且我想知道是否有一个我不知道的API,或者一个能让事情变得如此简单的库
byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin")
或
byte[] data = StreamUtils.readStreamToEnd(myInputStream)
例如!
答案 0 :(得分:30)
看一下Google guava ByteStreams.toByteArray(INPUTSTREAM)
,这可能就是你想要的。
答案 1 :(得分:15)
看一下Apache IOUtils - 它有很多方法可以使用流
答案 2 :(得分:9)
我通常使用以下两种方法将Resource
转换为byte[]
数组。
您需要先在getInputStream()
对象上调用Resource
,然后将其传递给convertStreamToByteArray
方法,如下所示....
InputStream stream = resource.getInputStream();
long size = resource.getFile().lenght();
byte[] byteArr = convertStreamToByteArray(stream, size);
public byte[] convertStreamToByteArray(InputStream stream, long size) throws IOException {
// check to ensure that file size is not larger than Integer.MAX_VALUE.
if (size > Integer.MAX_VALUE) {
return new byte[0];
}
byte[] buffer = new byte[(int)size];
ByteArrayOutputStream os = new ByteArrayOutputStream();
int line = 0;
// read bytes from stream, and store them in buffer
while ((line = stream.read(buffer)) != -1) {
// Writes bytes from byte array (buffer) into output stream.
os.write(buffer, 0, line);
}
stream.close();
os.flush();
os.close();
return os.toByteArray();
}
正如Konstantin V. Salikhov建议的那样,您可以使用org.apache.commons.io.IOUtils
并调用其IOUtils.toByteArray(stream)
static
方法,然后将InputStream
对象传递给它......
byte[] byteArr = IOUtils.toByteArray(stream);
Note -
我想我会在引擎盖下toByteArray(...)
进行检查以确保文件大小不大于Integer.MAX_VALUE
,因此您无需检查。
答案 3 :(得分:9)
Java 9本机实现:
byte[] data = this.getClass().getClassLoader().getResourceAsStream("/assets/myAsset.bin").readAllBytes();
答案 4 :(得分:6)
虽然我同意Andrew Thompson的观点,但这是一个自Java 7以来使用NIO-API的本机实现:
byte[] data = Files.readAllBytes(Paths.get(this.getClass().getClassLoader().getResource("/assets/myAsset.bin").toURI()));
答案 5 :(得分:4)
通常,Java方法将接受InputStream
。在大多数情况下,我建议将流直接传递给感兴趣的方法。
许多相同的方法也会接受URL
(例如从getResource(String)
获得)。这有时会更好,因为各种方法都需要可重新定位的InputStream
,有时候从getResourceAsStream(String)
返回的流不可以重新定位。