Фрагмент для создания файла из содержимого большого двоичного объекта в Java

У меня есть несколько файлов, хранящихся в столбце больших двоичных объектов базы данных в Oracle 9.

Я хотел бы, чтобы эти файлы хранились в файловой системе.

Это должно быть довольно легко, но я не нахожу подходящего фрагмента.

Как я могу сделать это в java?

 PreparedStatement ptmst = ...
 ResutlSet rs = pstmt.executeQuery();
 rs.getBlob();
 // mistery 
 FileOutputStream out = new FileOutputStream();
 out.write(); // etc et c

Я знаю, что это должно быть что-то вроде этого... чего я не знаю, так это того, что комментируется как тайна

Спасибо

ИЗМЕНИТЬ

Наконец-то я получил это из вопроса Дэвида.

Это моя ленивая реализация:

PreparedStatement pstmt = connection.prepareStatement("select BINARY from MYTABLE");
ResultSet rs = pstmt.executeQuery();
while( rs.next() ) {
    Blob blob = rs.getBlob("BINARY");
    System.out.println("Read "+ blob.length() + " bytes ");
    byte [] array = blob.getBytes( 1, ( int ) blob.length() );
    File file = File.createTempFile("something-", ".binary", new File("."));
    FileOutputStream out = new FileOutputStream( file );
    out.write( array );
    out.close();
}

person OscarRyz    schedule 02.07.2009    source источник


Ответы (2)


Вы хотите получить большой двоичный объект в качестве входного потока и вывести его содержимое в выходной поток. Таким образом, «страдание» должно быть чем-то вроде:

Blob blob = rs.getBlob(column);
InputStream in = blob.getBinaryStream();
OutputStream out = new FileOutputStream(someFile);
byte[] buff = new byte[4096];  // how much of the blob to read/write at a time
int len = 0;

while ((len = in.read(buff)) != -1) {
    out.write(buff, 0, len);
}

Если вы обнаружите, что выполняете много операций ввода-вывода, как это, вы можете использовать Apache Commons IO для позаботьтесь о деталях. Тогда все после настройки потоков будет просто:

IOUtils.copy(in, out);
person David Winslow    schedule 02.07.2009
comment
Это возвращает старые добрые воспоминания об использовании Oracle XML DB с Java. - person pjp; 03.07.2009

Есть еще один способ сделать ту же операцию быстрее. На самом деле ответ выше работает нормально, но, как и IOUtils.copy(in,out), для больших документов требуется много времени. Причина в том, что вы пытаетесь написать свой большой двоичный объект с помощью итерации 4 КБ. Более простое решение:

Blob blob = rs.getBlob(column);
InputStream in = blob.getBinaryStream();
OutputStream out = new FileOutputStream(someFile);
byte[] buff = blob.getBytes(1,(int)blob.getLength());
out.write(buff);
out.close();

Ваш outputStream запишет большой двоичный объект за один раз.

Изменить

Извините, не увидел раздел «Редактировать» в исходном сообщении.

person GiantSteps    schedule 27.12.2012