Подтвердить что ты не робот

Snippet для создания файла из содержимого blob в Java

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

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

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

Как это сделать в java?

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

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

Спасибо

ИЗМЕНИТЬ

Наконец, я получил это от Дэвида.

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

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();
}
4b9b3361

Ответ 1

Вы хотите получить blob как входной поток и выгрузить его содержимое в выходной поток. Поэтому "страдание" должно быть примерно таким:

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);
}

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

IOUtils.copy(in, out);

Ответ 2

Существует еще один способ ускорить выполнение одной и той же операции. На самом деле ответ выше работает отлично, но, как 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 будет писать blob одним выстрелом.

Edit

Извините, не видел раздел "Редактировать" в главной записи.