わかっている特定のクラスパスリソースの入力ストリームを取得する方法、最後に到達するまで入力ストリームから読み取る非常に一般的な問題のように見えますが、私が知らないAPIや、
byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin")
または
byte[] data = StreamUtils.readStreamToEnd(myInputStream)
例えば!
Google guava ByteStreams.toByteArray(INPUTSTREAM)
をご覧ください。これがあなたの望みかもしれません。
Apache IOUtils を見てください-ストリームを操作するための多数のメソッドがあります
Java 9ネイティブ実装:
byte[] data = this.getClass().getClassLoader().getResourceAsStream("/assets/myAsset.bin").readAllBytes();
Andrew Thompsonには同意しますが、ここではJava 7以降で動作し、NIO-APIを使用するネイティブ実装があります。
byte[] data = Files.readAllBytes(Paths.get(this.getClass().getClassLoader().getResource("/assets/myAsset.bin").toURI()));
通常、次の2つのアプローチを使用して、Resource
を_byte[]
_配列に変換します。
必要なのは、最初に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();
}
_
Konstantin V. Salikhovが提案したように、_org.Apache.commons.io.IOUtils
_を使用して、そのIOUtils.toByteArray(stream)
static
メソッドを呼び出し、それにInputStream
オブジェクトを渡すことができます...
_byte[] byteArr = IOUtils.toByteArray(stream);
_
_Note -
_フードの下でtoByteArray(...)
がファイルサイズが_Integer.MAX_VALUE
_より大きくないことを確認するので、これについて言及すると思ったので、これをチェックする必要はありません。
一般的にJavaメソッドはInputStream
を受け入れます。そのほとんどの場合、目的のメソッドにストリームを直接渡すことをお勧めします。
これらの同じメソッドの多くは、URL
(たとえば、getResource(String)
から取得)も受け入れます。さまざまなメソッドが再配置可能なInputStream
を必要とし、getResourceAsStream(String)
から返されるストリームがnotで再配置可能になる場合があるため、これはより良い場合があります。