Oracle9のデータベースblob列にいくつかのファイルが保存されています。
それらのファイルをファイルシステムに保存してもらいたいのですが。
これはかなり簡単なはずですが、適切なものが見つかりません。
Javaでこれを行うにはどうすればよいですか?
PreparedStatement ptmst = ...
ResutlSet rs = pstmt.executeQuery();
rs.getBlob();
// mistery
FileOutputStream out = new FileOutputStream();
out.write(); // etc et c
私はそれがそのようなものであるべきだと知っています...私が知らないのはミステリーとしてコメントされているものです
ありがとう
[〜#〜]編集[〜#〜]
私はついにこれをDavidの質問から導き出しました。
これは私の怠惰な実装です:
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();
}
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);
同じ操作をより速く行う別の方法があります。実際には上記の答えは問題なく機能しますが、IOUtils.copy(in,out)
のように、大きなドキュメントには多くの時間がかかります。その理由は、4KBの反復でblobを書き込もうとしているためです。より簡単な解決策:
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をワンショットで書き込みます。
編集
申し訳ありませんが、最初の投稿の編集セクションが表示されませんでした。