Как правильно преобразовать объект Blob в объект ByteArrayInputStream?

У меня есть некоторые сомнения относительно того, как преобразовать объект Blob (взятый из базы данных и представляющий PDF) в объект 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 из запроса к БД и прочитал его, получив ByteArrayOutputStream docPDF.

Затем я делаю что-то подобное, чтобы преобразовать мой документ ByteArrayOutputStream в объект ByteArrayInputStream:

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

Итак, я получил свой объект ByteArrayInputStream.

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

Tnx


person Community    schedule 23.02.2015    source источник
comment
Зачем вам ByteArrayInputStream? Вы хотите, чтобы InputStream оставался за транзакцией, в которой вы создаете большой двоичный объект? Если нет, просто используйте blob.getBinaryStream().   -  person Adrian Leonhard    schedule 23.02.2015
comment
Ответ на этот вопрос зависит от конечного назначения содержимого PDF. Обычно вы никогда не загрузите его в массив байтов, потому что это не очень хорошо масштабируется.   -  person Steve C    schedule 23.02.2015
comment
@AdrianLeonhard Поскольку я использую iText для создания PDF (начиная с содержимого Blob в моей БД), а iText использует ByteArrayOutputStream для создания PDF   -  person    schedule 23.02.2015
comment
Если он использует ByteArrayOutputStream для создания PDF, зачем вам создавать ByteArrayInputStream? Я предлагаю вам включить код, который вы используете для создания своего PDF-файла, поскольку это ваша реальная проблема.   -  person Adrian Leonhard    schedule 23.02.2015


Ответы (1)


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

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

bos = new ByteArrayOutputStream();
IOUtils.copy(rs.getBlob(1).getBinaryStream(), bos);
bos.flush();
byte[] contentData = bos.toByteArray();
person Johan Prins    schedule 23.02.2015