2009-07-02 14 views
12

bir blob'un içeriğinden bir dosya oluşturmak için.Snippet ben dosya sisteminde saklanan bu dosyaları istiyorum Oracle 9.</p> <p>bir veritabanı blob sütunda depolanan bazı dosyaları var Java

Bu oldukça kolay olmalı, ancak doğru snipped bulmuyorum.

Bunu java'da nasıl yapabilirim?

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

ne bilmiyorum mistery olarak

Teşekkür

DÜZENLEME nihayet

ben yorumladı budur ... böyle bir şey olması gerektiğini biliyorum Bunu David'in sorusundan elde etti.

Bu benim tembel uygulamasıdır: Bir InputStream olarak blob almak ve OutputStream onun içeriğini dökümü isterdim

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

cevap

18

. Yani 'sefalet' gibi bir şey olmalı: Kendinizi böyle IO bir sürü iş yaparken buluyorsanız

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

, ayrıntılar dikkat çekmek için Apache Commons IO kullanarak içine görünebilir. Daha sonra akışları kurduktan sonra her şey şöyle olurdu:

IOUtils.copy(in, out); 
+0

Java ile Oracle XML DB kullanarak bazı eski eski hatıraları getiriyor. – pjp

1

Aynı işlemi daha hızlı yapmanın başka bir yolu daha var. Aslında yukarıdaki cevap iyi çalışıyor ancak IOUtils.copy(in,out) gibi büyük belgeler için çok zaman alıyor. Nedeni, bloğunuzu 4 KB yineleme ile yazmaya çalışıyorsunuz. Simplier solution:

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

Çıktı akışınız blobunuzu tek çekimde yazacaktır.

Düzenleme

İntial Post Düzenleme bölümüne görmedim üzgünüm.