web-dev-qa-db-ja.com

クラスパスリソースをバイトの配列にロードする方法は?

わかっている特定のクラスパスリソースの入力ストリームを取得する方法、最後に到達するまで入力ストリームから読み取る非常に一般的な問題のように見えますが、私が知らないAPIや、

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

または

byte[] data = StreamUtils.readStreamToEnd(myInputStream)

例えば!

26
Samuel Rossille

Google guava ByteStreams.toByteArray(INPUTSTREAM)をご覧ください。これがあなたの望みかもしれません。

31
user1335794

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

Java 9ネイティブ実装:

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

Andrew Thompsonには同意しますが、ここではJava 7以降で動作し、NIO-APIを使用するネイティブ実装があります。

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

通常、次の2つのアプローチを使用して、Resourceを_byte[]_配列に変換します。

1-アプローチ

必要なのは、最初にResourceオブジェクトでgetInputStream()を呼び出してから、以下のように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_より大きくないことを確認するので、これについて言及すると思ったので、これをチェックする必要はありません。

9
Simple-Solution

一般的にJavaメソッドはInputStreamを受け入れます。そのほとんどの場合、目的のメソッドにストリームを直接渡すことをお勧めします。

これらの同じメソッドの多くは、URL(たとえば、getResource(String)から取得)も受け入れます。さまざまなメソッドが再配置可能なInputStreamを必要とし、getResourceAsStream(String)から返されるストリームがnotで再配置可能になる場合があるため、これはより良い場合があります。

4
Andrew Thompson