1

У меня есть некоторые сомнения в том, как преобразовать объект Blob (взятый из базы данных и представляющий собой PDF) в объект ByteArrayInputStream.Как правильно преобразовать объект Blob в объект ByteArrayInputStream?

Так что я знаю, что я могу сделать что-то вроде этого:

ByteArrayOutputStream docPDF = null; 
InputStream blobinstream = null; 

Blob blob = rset.getBlob("PDF"); // I obtain it from a result set DB query 

if(blob!=null) { 
    blobinstream = blob.getBinaryStream(); 
    int chunk = 1024; 
    byte[] buffer = new byte[chunk]; 
    int length = -1; 

    docPDF = new ByteArrayOutputStream(); 

    while ((length = blobinstream.read(buffer)) != -1) { 
     docPDF.write(buffer, 0, length); 
    } 

    docPDF.flush(); 

Таким образом, в предыдущем фрагменте кода я получил Blob объект из запроса DB, и я прочитал его получения ByteArrayOutputStream docPDF.

Тогда я сделать что-то вроде этого, чтобы преобразовать мой ByteArrayOutputStream docPDF в ByteArrayInputStream объекта:

ByteArrayInputStream currentPdfBAIS = new ByteArrayInputStream(docPDF.toByteArray()); 

Таким образом, я получил мой ByteArrayInputStream объект.

Он отлично работает, но это лучший способ сделать это? Могу ли я получить ByteArrayInputStream объект, начинающийся с Blob объект без прохождения через ByteArrayOutputStream docPdf объект? Или предыдущее представленное решение является правильным?

Tnx

+0

Почему вы хотите ByteArrayInputStream? Вы хотите сохранить InputStream за транзакцией, в которой вы создаете blob? Если нет, просто используйте blob.getBinaryStream(). –

+0

Ответ на этот вопрос зависит от конечного назначения содержимого PDF. Обычно вы никогда не загрузите его в массив байтов, потому что он не будет масштабироваться очень хорошо. –

+0

@AdrianLeonhard Поскольку я использую iText для создания PDF (начиная с содержимого Blob в моей БД), а iText использует ByteArrayOutputStream для создания PDF-файла –

ответ

-2

Когда вы получите входной поток вам нужно записать его на что-то, так что ваш пример выше порядке. Имейте в виду, что вы читаете весь файл в памяти. Если это желаемый результат, тогда это нормально.

Для того, чтобы упростить мой код я использую IOUtils в Apache:

bos = new ByteArrayOutputStream(); 
IOUtils.copy(rs.getBlob(1).getBinaryStream(), bos); 
bos.flush(); 
byte[] contentData = bos.toByteArray(); 
Смежные вопросы