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

问题描述 投票:0回答:6

我知道如何获取给定类路径资源的输入流,从输入流读取直到我到达结尾,但这看起来是一个非常普遍的问题,我想知道是否有我不知道的 API ,或者一个可以让事情变得像

一样简单的库
byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin")

byte[] data = StreamUtils.readStreamToEnd(myInputStream)

例如!

java io inputstream embedded-resource
6个回答
44
投票

Java 9 原生实现:

    byte[] data = this.getClass().getClassLoader()
        .getResourceAsStream("/assets/myAsset.bin").readAllBytes();

39
投票

看看谷歌番石榴

ByteStreams.toByteArray(INPUTSTREAM)
,这可能是你想要的。


24
投票

虽然我同意 Andrew Thompson 的观点,但这是一个从 Java 7 开始工作并使用 NIO-API 的本地实现:

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

17
投票

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


12
投票

我通常使用以下两种方法将

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
,所以你不必检查这个。


4
投票

通常 Java 方法将接受

InputStream
。在大多数情况下,我建议将流直接传递给感兴趣的方法。

许多相同的方法也将接受

URL
(例如从
getResource(String)
获得)。这有时会更好,因为各种方法都需要可重新定位的
InputStream
并且有时从
getResourceAsStream(String)
返回的流将 not 是可重新定位的。

© www.soinside.com 2019 - 2024. All rights reserved.