Java 如何将类路径资源加载到字节数组?

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),这可能就是您想要

我知道如何获取给定类路径资源的inputstream,从inputstream读取到最后,但这似乎是一个非常常见的问题,我想知道是否有一个我不知道的API,或者一个库可以让事情变得像

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()));