18

Oracle 9 のデータベース BLOB 列にいくつかのファイルを保存しています。

これらのファイルをファイル システムに保存したいと考えています。

これはかなり簡単なはずですが、適切なものが切り取られているとは思いません。

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

2 に答える 2

26

ブロブを入力ストリームとして取得し、その内容を出力ストリームにダンプする必要があります。したがって、「惨めさ」は次のようになります。

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);
于 2009-07-02T22:58:41.340 に答える
1

同じ操作をより速く行う別の方法があります。実際、上記の答えは問題なく機能IOUtils.copy(in,out)しますが、大きなドキュメントの場合は時間がかかります。その理由は、4KB の繰り返しでブロブを書き込もうとしているからです。より簡単なソリューション:

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 は一発でブロブを書き込みます。

編集

申し訳ありませんが、最初の投稿の編集セクションが表示されませんでした。

于 2012-12-27T10:33:23.557 に答える