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)