Подтвердить что ты не робот

Как загрузить ресурс classpath в массив байтов?

Я знаю, как получить входной поток для данного ресурса pathpath, прочитанный из входного потока до тех пор, пока я не дойду до конца, но он выглядит как очень распространенная проблема, и мне интересно, есть ли API, который Я не знаю, или библиотека, которая сделает вещи такими же простыми, как

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

или

byte[] data = StreamUtils.readStreamToEnd(myInputStream)

например!

4b9b3361

Ответ 1

Посмотрите на Google guava ByteStreams.toByteArray(INPUTSTREAM), это может быть то, что вы хотите.

Ответ 2

Взгляните на Apache IOUtils - у него есть куча методов для работы с потоками

Ответ 3

Обычно я использую следующие два подхода для преобразования 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 - подход

Как предложил Константин В. Салихов, вы можете использовать org.apache.commons.io.IOUtils и вызвать его метод IOUtils.toByteArray(stream) static и передать ему объект InputStream, подобный этому...

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

Note - Просто подумал, что я упомяну, что под капотом toByteArray(...) проверяется, чтобы размер файла не превышал Integer.MAX_VALUE, поэтому вам не нужно это проверять.

Ответ 4

Обычно методы Java принимают InputStream. В этом большинстве случаев я бы рекомендовал передать поток непосредственно в интересующий метод.

Многие из тех же методов также принимают URL (например, полученные из getResource(String)). Иногда это может быть лучше, так как для разных методов потребуется перепозиционируемое InputStream, и бывают случаи, когда поток, возвращаемый из getResourceAsStream(String), не будет повторно использоваться.