2011-11-10 4 views
3

Je crée un programme qui va extraire un zip puis insérez les fichiers dans une base de données, chaque si souvent je reçois l'erreurzip extrait java fin inattendue du flux d'entrée ZLIB

java.lang.Exception: java.io.EOFException: Unexpected end of ZLIB input stream 

Je ne peux pas préciser la raison pour cela que le code d'extraction est à peu près le même que tous les autres codes que vous pouvez trouver sur le web. Mon code est le suivant:

public void extract(String zipName, InputStream content) throws Exception { 

    int BUFFER = 2048; 

    //create the zipinputstream 
    ZipInputStream zis = new ZipInputStream(content); 

    //Get the name of the zip 
    String containerName = zipName; 

    //container for the zip entry 
    ZipEntry entry; 

    // Process each entry 
    while ((entry = zis.getNextEntry()) != null) { 

     //get the entry file name 
     String currentEntry = entry.getName(); 

     try { 

       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

       // establish buffer for writing file 
       byte data[] = new byte[BUFFER]; 
       int currentByte; 

       // read and write until last byte is encountered 
       while ((currentByte = zis.read(data, 0, BUFFER)) != -1) { 

        baos.write(data, 0, currentByte); 
       } 

       baos.flush(); //flush the buffer 

       //this method inserts the file into the database 
       insertZipEntry(baos.toByteArray()); 

       baos.close(); 

     } 
     catch (Exception e) { 
      System.out.println("ERROR WITHIN ZIP " + containerName); 
     } 
    } 
} 
+1

• Avez-vous vérifié que le flux ZIP (fichier) que vous essayez de traiter est valide (par exemple, «unzip» peut le décompresser)? • Veuillez localiser la ligne dans le code qui a réellement déclenché l'exception. –

+1

Je ne me souviens pas correctement, mais n'êtes-vous pas censé fermer chaque entrée après l'avoir traitée? – biziclop

+0

Vous devriez fermer le baos avant d'appeler insertZipEntry(), et notre variable 'currentByte' est mal nommée: devrait être 'count' ou similaire. – EJP

Répondre

-1

N'essayez jamais de lire plus d'octets que l'entrée ne contient. Appelez ZipEntry.getSize() pour obtenir la taille réelle de l'entrée, puis utilisez cette valeur pour garder trace du nombre d'octets restants dans l'entrée lors de la lecture. Voir ci-dessous:

try{  

    ... 

    int bytesLeft = (int)entry.getSize(); 
    while (bytesLeft>0 && (currentByte=zis.read(data, 0, Math.min(BUFFER, bytesLeft))) != -1) { 
    ... 
    } 

    ... 

    } 
+0

Ce n'est pas nécessaire. Le ZipInputStream prend soin de cela pour vous. – EJP

+0

EJP: et pourtant il échoue. Cependant, entry.getSize() et entry.getCompressedSize() renvoient -1 pour moi. – Buffalo

1

Je dirais qu'on vous donne occasionnellement des fichiers Zip tronqués à traiter. Vérifiez en amont.

Questions connexes