Ответ 1
Посмотрите на Google guava ByteStreams.toByteArray(INPUTSTREAM)
, это может быть то, что вы хотите.
Я знаю, как получить входной поток для данного ресурса pathpath, прочитанный из входного потока до тех пор, пока я не дойду до конца, но он выглядит как очень распространенная проблема, и мне интересно, есть ли API, который Я не знаю, или библиотека, которая сделает вещи такими же простыми, как
byte[] data = ResourceUtils.getResourceAsBytes("/assets/myAsset.bin")
или
byte[] data = StreamUtils.readStreamToEnd(myInputStream)
например!
Посмотрите на Google guava ByteStreams.toByteArray(INPUTSTREAM)
, это может быть то, что вы хотите.
Взгляните на Apache IOUtils - у него есть куча методов для работы с потоками
Обычно я использую следующие два подхода для преобразования Resource
в массив byte[]
.
Вам нужно сначала вызвать 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();
}
Как предложил Константин В. Салихов, вы можете использовать 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)
, не будет повторно использоваться.