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

Sam*_*lle 27 java io inputstream embedded-resource

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

byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin")
Run Code Online (Sandbox Code Playgroud)

要么

byte[] data = StreamUtils.readStreamToEnd(myInputStream)
Run Code Online (Sandbox Code Playgroud)

例如!

use*_*794 31

看看谷歌番石榴ByteStreams.toByteArray(INPUTSTREAM),这可能是你想要的.


Kon*_*hov 16

看看Apache IOUtils - 它有很多方法可以处理流

  • 更确切地说是`IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream("XXX")` (12认同)
  • 我最喜欢的是`IOUtils.resourceToByteArray("XXX", getClass().getClassLoader())`,因为它有点短。 (2认同)

Mar*_*gor 13

Java 9本机实现:

byte[] data = this.getClass().getClassLoader().getResourceAsStream("/assets/myAsset.bin").readAllBytes();
Run Code Online (Sandbox Code Playgroud)

  • 方法 InputStream.readAllBytes() 是从 Java 9 开始的 (2认同)

ltl*_*Boy 11

虽然我同意Andrew Thompson,但这是一个自Java 7以来使用NIO-API的本机实现:

byte[] data = Files.readAllBytes(Paths.get(this.getClass().getClassLoader().getResource("/assets/myAsset.bin").toURI()));
Run Code Online (Sandbox Code Playgroud)


Sim*_*ion 9

我通常使用以下两种方法转换Resourcebyte[]数组.

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();
}
Run Code Online (Sandbox Code Playgroud)

2 - 方法

正如Konstantin V. Salikhov建议的那样,你可以使用org.apache.commons.io.IOUtils并调用它的IOUtils.toByteArray(stream) static方法并传递给它InputStream像这样的对象......

byte[] byteArr = IOUtils.toByteArray(stream);
Run Code Online (Sandbox Code Playgroud)

Note -我想我会提到这一点,在引擎盖 toByteArray(...)检查下确保文件大小不大Integer.MAX_VALUE,所以你不必检查这个.