2009-07-02 11 views
12

にブロブの内容からファイルを作成します。スニペットは、私は、ファイルシステムに保存されているそれらのファイルを持っていると思いオラクル9.</p> <p>で、データベースのBLOB列に格納されているいくつかのファイルを持っているJavaの

これはかなり簡単なはずですが、私は右のスナップを見つけられません。

どのように私はjavaでこれを行うことができますか?

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

私は知らない何...それはそのようなものでなければなりません知っているが謎とコメントしているものである

おかげ

EDIT

ついにIダビデの質問から導かれたものです。

これは私の怠惰な実装です:

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

答えて

18

あなたはInputStreamとしてブロブを取得し、OutputStreamにその内容をダンプしたいと思います。あなた自身がこのようにIOの多くの仕事をやって見つけた場合、あなたが細部の世話をするためにApache Commons IOを使用してに見えるかもしれません

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

:だから「不幸は」のようなものでなければなりません。ストリームを設定した後のすべては、次のようになります。

IOUtils.copy(in, out); 
+0

これは、Oracle XML DB with Javaを使用して、古い古き良き思い出をもたらします。 – pjp

1

同じ操作を高速に実行する別の方法があります。実際には上の答えはうまく動作しますが、IOUtils.copy(in,out)のように大きな文書には多くの時間がかかります。理由は、あなたのBLOBを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はblobをワンショットで書き込みます。

編集

intialポストの編集]セクションが表示されませんでした申し訳ありません。

関連する問題