IOUtils.toByteArray возвращает пустой байтовый массив

Я новичок в разработке Java, поэтому заранее прошу прощения, если я спрашиваю что-то глупое.

Я пытаюсь получить изображение и его миниатюру из базы данных SQL. Я получаю данные от ResultSet в BinaryStream форматировать, а затем преобразовать его в byte[],

Для миниатюр работает нормально и для оригинального изображения тоже могу найти BinaryStream с помощью getBinaryStream метод Но когда я преобразую его в byte[], массив остается пустым по какой-то причине.

binaryStream = rs.getBinaryStream("image");
thumbBinaryStream = rs.getBinaryStream("thumbnail");
if (binaryStream != null) {
    // Tested on following line and I get empty imageBytes
    byte[] imageBytes = IOUtils.toByteArray(binaryStream); 
    thisRecord.put("image", DatatypeConverter.printBase64Binary(imageBytes)); // imageBytes is empty here 
}

2 ответа

Возможно, нам понадобится дополнительная информация, особенно о типах данных столбцов, но, возможно, это поможет извлечь поток из BLOB, как в этом примере:

if (rs.getMetaData().getColumnType(column) == Types.BLOB) {
        in = rs.getBlob(column).getBinaryStream();
    } else {
        in = rs.getBinaryStream(column);
    }

Чтобы быть уверенным: Statement и ResultSet должны быть закрыты и getBinaryStream используется только когда ResultSet еще открыт, например:

try (ResultSet rs = stmt.executeQuery()) {
    while (rs.next()) {
        InputStream binaryStream = rs.getBinaryStream("image");
        InputStream thumbBinaryStream = rs.getBinaryStream("thumbnail");
        if (binaryStream != null) {
            // Tested on following line and I get empty imageBytes
            byte[] imageBytes = IOUtils.toByteArray(binaryStream); 
            thisRecord.put("image", DatatypeConverter.printBase64Binary(imageBytes));
            boolean mustGenerateThumbnail = thumbBinaryStream == null;
            if (mustGenerateThumbnail ) {
                thumbBinaryStream = generateThumbnail(imageBytes);
            }
            byte[] thumbBytes = IOUtils.toByteArray(thumbBinaryStream);
            thisRecord.put("thumbnail", DatatypeConverter.printBase64Binary(thumbBytes));

Здесь мы находимся по ошибке. На этом этапе thumbBinaryStream читается до конца, так что:

            if (mustGenerateThumbnail ) {
                ByteArrayInputStream baIn = new ByteArrayInputStream(thumbBytes);
                saveThumbnailForRecordWithId(baIn, floor_drawing_id);
            }
        }
    }
}

(Здесь я использовал try-with-resources для автоматического закрытия ResultSet даже при выданном исключении.)

Кроме того, есть более общий класс для Base64. Если у вас в будущем возникнет необходимость в этом.

DatatypeConverter.printBase64Binary(thumbBytes)
Base64.getEncoder().encodeToString(thumbBytes)
Другие вопросы по тегам