7
votes

Pourquoi ZipInputStream ne peut pas lire la sortie de ZipOutPutStream?

Je suis coincé avec ce test Junit:

public void test() throws Exception {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ZipOutputStream zipOut = new ZipOutputStream( out );
    zipOut.putNextEntry( new ZipEntry( "file" ) );
    zipOut.write( (new byte[] { 0x01, 0x02, 0x03 }) );
    zipOut.closeEntry();
    zipOut.close();

    ZipInputStream zipIn = new ZipInputStream( new ByteArrayInputStream( out.toByteArray() ) );
    ZipEntry entry = zipIn.getNextEntry();
    assertNotNull( entry );
    assertEquals( "file", entry.getName() );
    assertEquals( 3, entry.getSize() );
}


1 commentaires

J'ai essayé votre code - en effet cela ne fonctionne pas. Je suis dérouté. Enquêter.


5 Réponses :


2
votes

J'ai trouvé la réponse par moi-même: entrée ne contient pas la taille correcte, mais avec chaque zipin.getnextentry () Vous obtenez un nouveau flux pour lire le contenu de la contenue de votre entrée de. Donc, simplement lire le flux jusqu'à la fin et vous avez les données de votre entrée.

Dans mon test JUnit, la dernière ligne pourrait ressembler à ceci: xxx

maintenant tout fonctionne bien.


0 commentaires

2
votes

lire API DOC pour ZipENTry. Il dit "si connu". Vous pouvez lire le contenu en utilisant ce qui suit (il imprime simplement la taille de la ZipENTry, modifie les données de processus informatiques de manière appropriée): xxx


0 commentaires

4
votes

Vous devez réellement lire le contenu de l'entrée, puis entrée.getsize () code> retournera la bonne taille.

Pour lire l'entrée Utilisation: P>

    byte[] buf = new byte[1024];
    int len;
    while ((len = zipIn.read(buf)) > 0) {
        // use data;
    }


2 commentaires

Oh c'est gentil. J'ai manqué de regarder les champs d'information de la ZipENTry après avoir lu les données ... Merci pour cet indice!


La chose est, il y a une entrée locale précédant une ZipENTry et une entrée ext après une ZipENTry. Les deux ont un champ de taille. ZipOutputStream toujours écrit 0 dans LOC.SIZE, tandis que d'autres architons écrivent la taille dans LOC ainsi que EXT. Je me demande combien de problèmes cela pourrait causer et comment faire de ZipOutputStream Écrivez la taille dans le LOC?



0
votes

même problème ici!

zipinputtream ne peut pas lire la sortie de ZipOutPutStream;

Nouveau zipfile (fichier) échoue avec une erreur

aucune explication possible!

Programme Viewer Archive Ouvre le fichier ZIP juste bien!

solution: euh ... ce n'était pas un fichier zip après tout ... C'était un goudron appelé "dossier.zip". Visionneuse d'archives était assez intelligente ...

à ceux avec ce problème: vérification double !!!


1 commentaires

Je suis désolé, mais de quoi parlez-vous? Vous avez écrit un goudron avec un zipOutputStream ??



0
votes

Récemment, j'ai eu un problème similaire lors de la lecture d'un octets zip créé à l'aide de ZipOutPutStream.

L'extrait suivant a conduit à java.lang.negativearraaysizexception. p>

zipEntry = zipInputStream.getNextEntry();
byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(zipInputStream);


0 commentaires