42

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

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

或者

byte[] data = StreamUtils.readStreamToEnd(myInputStream)

例如!

4

6 回答 6

38

Java 9 原生实现:

byte[] data = this.getClass().getClassLoader().getResourceAsStream("/assets/myAsset.bin").readAllBytes();
于 2018-02-23T14:26:32.027 回答
36

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

于 2012-05-30T08:34:15.157 回答
22

尽管我同意 Andrew Thompson 的观点,但这是一个从 Java 7 开始就可以使用并使用 NIO-API 的本机实现:

byte[] data = Files.readAllBytes(Paths.get(this.getClass().getClassLoader().getResource("/assets/myAsset.bin").toURI()));
于 2018-06-14T08:25:37.400 回答
17

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

于 2012-05-30T08:24:44.367 回答
12

我通常使用以下两种方法来转换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();
}

2 - 方法

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

byte[] byteArr = IOUtils.toByteArray(stream);

Note -只是想我会提到这一点,在后台 toByteArray(...)检查以确保文件大小不大于Integer.MAX_VALUE,因此您不必检查这一点。

于 2015-01-15T17:16:13.203 回答
4

Java 方法通常会接受一个InputStream. 在大多数情况下,我建议将流直接传递给感兴趣的方法。

许多相同的方法也将接受URL(例如从 获得getResource(String))。有时这可能会更好,因为各种方法都需要可重新定位InputStream,并且有时返回的流getResourceAsStream(String)无法重新定位。

于 2012-05-30T09:16:30.363 回答