2009-07-02 2 views
12

Ich habe einige gespeicherte Dateien in einer Datenbank BLOB-Spalte in Oracle 9.Snippet eine Datei aus dem Inhalt eines Blob in Java erstellen

Ich mag würde diese Dateien im Dateisystem gespeichert haben.

Das sollte ziemlich einfach sein, aber ich finde nicht das richtige geschnippelt.

Wie kann ich das in Java tun?

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

Ich weiß es so etwas wie das sein sollte ... was ich nicht weiß, ist das, was als Mistery

Dank kommentiert wird

EDIT

ich endlich hat dies aus Davids Frage abgeleitet.

Dies ist meine faul Implementierung:

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

Antwort

18

Sie wollen würde das Blob als Eingabestrom zu erhalten und seinen Inhalt an den Output Dump. So ‚Elend‘ etwas sein sollte:

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

Wenn Sie sich selbst, wie dies viele IO Arbeit finden zu tun, könnten Sie in aussehen Apache Commons IO mit Pflege der Details zu nehmen. Dann wäre alles nach dem Einrichten der Streams einfach:

IOUtils.copy(in, out); 
+0

Das bringt einige gute alte Erinnerungen mit Oracle XML DB mit Java zurück. – pjp

1

Es gibt eine andere Möglichkeit, die gleiche Operation schneller zu machen. Eigentlich funktioniert die Antwort oben gut, aber wie IOUtils.copy(in,out) dauert es eine Menge Zeit für große Dokumente. Der Grund dafür ist, dass Sie versuchen, Ihren Blob durch 4KB-Iteration zu schreiben. Simplier Lösung:

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

Ihr outputStream wird den Blob in einem Schuss schreiben.

bearbeiten

leider nicht bearbeiten Abschnitt auf der intial Beitrag sehen.