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

グーグルグアバを見てください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

ApacheIOUtilsを見てください-ストリームを操作するためのメソッドがたくさんあります

于 2012-05-30T08:24:44.367 に答える
12

私は通常、次の2つのアプローチを使用して配列に変換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) staticInputStream

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 に答える