Java 如何将类路径资源加载到字节数组?
我知道如何获取给定类路径资源的inputstream,从inputstream读取到最后,但这似乎是一个非常常见的问题,我想知道是否有一个我不知道的API,或者一个库可以让事情变得像Java 如何将类路径资源加载到字节数组?,java,io,inputstream,embedded-resource,Java,Io,Inputstream,Embedded Resource,我知道如何获取给定类路径资源的inputstream,从inputstream读取到最后,但这似乎是一个非常常见的问题,我想知道是否有一个我不知道的API,或者一个库可以让事情变得像 byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin") 或 比如说 看看Apache-它有一系列处理流的方法看看Google guavaByTestStreams.toByteArray(INPUTSTREAM),这可能就是您想要
byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin")
或
比如说 看看Apache-它有一系列处理流的方法看看Google guava
ByTestStreams.toByteArray(INPUTSTREAM)
,这可能就是您想要的。通常Java方法会接受INPUTSTREAM
。在大多数情况下,我建议将流直接传递给感兴趣的方法
许多相同的方法也会接受
URL
(例如,从getResource(String)
获取)。这有时会更好,因为各种方法都需要可重新定位的InputStream
,并且从getResourceAsStream(String)
返回的流有时无法重新定位。我通常使用以下两种方法将资源
转换为字节[]
array
1-方法
您需要的是首先调用Resource
对象上的getInputStream()
,然后将其传递给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();
}
2-方法
正如Konstantin V.Salikhov所建议的,您可以使用org.apache.commons.io.IOUtils
并调用它的IOUtils.toByteArray(stream)
静态
方法,然后像这样传递给它InputStream
对象
byte[] byteArr = IOUtils.toByteArray(stream);
注意-
我想我会提到这一点,在引擎盖下toByteArray(…)
检查以确保文件大小不大于Integer.MAX\u值,因此您不必检查此值 Java 9本机实现:
byte[] data = this.getClass().getClassLoader().getResourceAsStream("/assets/myAsset.bin").readAllBytes();
虽然我同意Andrew Thompson的观点,但这里有一个自Java 7开始工作的本机实现,它使用NIO-API:
byte[] data = Files.readAllBytes(Paths.get(this.getClass().getClassLoader().getResource("/assets/myAsset.bin").toURI()));
“这看起来像是一个非常常见的问题”通常Java方法会接受InputStream
。我认为对于Guava,这或多或少是资源。toByteArray(Resources.getResource(contextClass,resourceName))
?@andrewhompson您刚才阻止了我在这种情况下做一些愚蠢的事情,谢谢。输入为(备选)回答。;(好方法,但我认为你的意思是将StreamToByteArray转换为StreamToByteArray而不是Steam.:)回答得好。@PabloRS我已经纠正了错误。Ta:)更准确地说,这对我在2016年很有用。IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream(“XXX”)
这对我来说很有用。通过@yunandtidus的建议,我正在使用最新版本的IOUtils和Maven:,谢谢。
byte[] data = Files.readAllBytes(Paths.get(this.getClass().getClassLoader().getResource("/assets/myAsset.bin").toURI()));