如何将类路径资源加载到byte数组?

时间:2012-05-30 08:22:57

标签: java io inputstream embedded-resource

我知道 如何获取给定类路径资源的输入流,从输入流读取直到我到达终点,但它看起来像一个非常常见的问题,并且我想知道是否有一个我不知道的API,或者一个能让事情变得如此简单的库

byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin")

byte[] data = StreamUtils.readStreamToEnd(myInputStream)

例如!

6 个答案:

答案 0 :(得分:30)

看一下Google guava ByteStreams.toByteArray(INPUTSTREAM),这可能就是你想要的。

答案 1 :(得分:15)

看一下Apache IOUtils - 它有很多方法可以使用流

答案 2 :(得分:9)

我通常使用以下两种方法将Resource转换为byte[]数组。

1 - 接近

您需要先在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();
}

2 - 接近

正如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)返回的流可以重新定位。