2010-04-02 21 views
0

Je lis une colonne BLOB à partir d'une base de données Oracle, puis l'écrire dans un fichier comme suit:comment régler BufferedInputStream read()?

public static int execute(String filename, BLOB blob) 
    { 

    int success = 1; 

    try 
    { 
     File    blobFile = new File(filename); 
     FileOutputStream outStream = new FileOutputStream(blobFile); 
     BufferedInputStream inStream = new BufferedInputStream(blob.getBinaryStream()); 

     int  length = -1; 
     int  size = blob.getBufferSize(); 
     byte[] buffer = new byte[size]; 

     while ((length = inStream.read(buffer)) != -1) 
     { 
     outStream.write(buffer, 0, length); 
     outStream.flush(); 
     } 

     inStream.close(); 
     outStream.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     System.out.println("ERROR(img_exportBlob) Unable to export:"+filename); 
     success = 0; 
    } 
} 

La taille du fichier est d'environ 3 Mo et il faut 40-50s lire la mémoire tampon. C'est en fait une image 3D. Alors, y a-t-il un moyen par lequel je peux réduire cette fois?

+0

Probablement pas au niveau Java. Je ne pense pas que l'écriture dans le fichier soit le goulot d'étranglement. Cela prend probablement autant de temps à lire et à jeter. – Thilo

Répondre

3

Étant donné que le blob a déjà le concept d'un tampon, il est possible que vous êtes en fait nuire performances en utilisant le BufferedInputStream du tout - il peut être fait plus petits read() appels, faire plus d'appels de réseau que nécessaire. Essayez de vous débarrasser complètement du BufferedInputStream, en lisant directement à partir du flux binaire du blob. Ce n'est qu'une pensée, mais ça vaut le coup d'essayer. Oh, et vous n'avez pas besoin de vider le flux de sortie chaque fois que vous écrivez.

(En aparté, vous devez b flux de fermeture en blocs enfin - sinon vous aurez des fuites poignées si quelque chose lève une exception.)