2009-07-02 6 views
12

J'ai des fichiers stockés dans une colonne de blob de base de données Oracle 9.Snippet pour créer un fichier à partir du contenu d'un blob en Java

Je voudrais avoir les fichiers stockés dans le système de fichiers.

Cela devrait être assez facile, mais je ne trouve pas le droit coupé.

Comment puis-je faire cela en Java?

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

je sais que ce doit être quelque chose comme ça ... ce que je ne sais pas est ce qui est commenté comme mistery

Merci

EDIT

J'ai finalement eu ceci dérivé de la question de David.

Ceci est ma mise en œuvre paresseuse:

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

Répondre

18

Vous voudriez obtenir le blob comme un flux entrant et de vider son contenu dans le outputstream. Donc, « la misère » devrait être quelque chose comme:

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

Si vous vous trouvez faire beaucoup de travail IO comme celui-ci, vous pouvez regarder dans Apache Commons IO pour prendre soin des détails. Ensuite, tout ce qui suit la configuration des flux sera simplement:

IOUtils.copy(in, out); 
+0

Cela ramène quelques bons vieux souvenirs en utilisant Oracle XML DB avec Java. – pjp

1

Il existe une autre façon de faire la même opération plus rapidement. En fait, la réponse ci-dessus fonctionne bien, mais comme IOUtils.copy(in,out) il faut beaucoup de temps pour les gros documents. La raison en est que vous essayez d'écrire votre blob par itération 4KB. Une solution plus simple:

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

Votre flux de sortie écrira le blob en une seule fois.

Modifier

Désolé n'a pas vu la section Modifier le intial Post.