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() ); }
5 Réponses :
J'ai trouvé la réponse par moi-même: Dans mon test JUnit, la dernière ligne pourrait ressembler à ceci: p> maintenant tout fonctionne bien. p> p> entrée code> ne contient pas la taille correcte, mais avec chaque
zipin.getnextentry () code> 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.
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):
Vous devez réellement lire le contenu de l'entrée, puis Pour lire l'entrée Utilisation: P> entrée.getsize () code> retournera la bonne taille.
byte[] buf = new byte[1024];
int len;
while ((len = zipIn.read(buf)) > 0) {
// use data;
}
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?
même problème ici! p>
zipinputtream ne peut pas lire la sortie de ZipOutPutStream; p>
Nouveau zipfile (fichier) échoue avec une erreur p>
aucune explication possible! p>
Programme Viewer Archive Ouvre le fichier ZIP juste bien! P>
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 ... P>
à ceux avec ce problème: vérification double !!! p>
Je suis désolé, mais de quoi parlez-vous? Vous avez écrit un goudron avec un zipOutputStream ??
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);
J'ai essayé votre code - en effet cela ne fonctionne pas. Je suis dérouté. Enquêter.