Causes et solutions à la compression zip Java tronquée : (Recommandé : Tutoriel vidéo Java)
Environnement d'exécution
Jdk 1.5 , win 7 version chinoise
JDK1.5 possède une API liée à la compression zip, qui se trouve sous le package java.util.zip. Dans des circonstances normales, utilisez l'API fournie avec le JDK pour compresser le répertoire (fichier) dans un package zip. Les étapes sont les suivantes :
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(file)); Out.putNextEntry(new ZipEntry(entryName)); //If entry is directory //above codes are enough //else if entry is file //then the codes below is needed FileInputStream in = new FileInputStream(infile); byte[] bs = newbyte[1024]; int b = 0; while((b = in.read(bs)) != -1) { zos.write(bs, 0, b); } in.close();
Si le nom du répertoire ou le nom du fichier à empaqueter contient des caractères chinois. , les noms de ces répertoires ou fichiers apparaîtront avec des caractères tronqués. La raison est que dans l'API fournie avec le JDK, lors de l'écriture de ZipEntry, l'encodage par défaut utilisé est UTF8 (il semble qu'il n'y ait que celui-ci, et il n'y en a pas). façon de le changer. On dit que Java7 s'est amélioré), et le fonctionnement de win7. La version chinoise du système utilise le codage GBK lors du traitement des fichiers zip. Les processus de codage et de décodage sont différents, ce qui entraîne une déformation des fichiers emballés dans la version chinoise. de win7.
La solution qui peut être adoptée consiste à utiliser une API tierce pour implémenter la compression zip afin de résoudre le problème des caractères chinois tronqués. Ce qui suit est l'implémentation de la compression zip à l'aide de la compression d'Apache. Le package jar requis est commons-compress-1.2.jar
ArchiveOutputStream os = new ArchiveStreamFactory() .createArchiveOutputStream(ArchiveStreamFactory.ZIP, out); if(os instanceof ZipArchiveOutputStream) { ((ZipArchiveOutputStream) os).setEncoding("GBK"); } //...some code omitted os.putArchiveEntry(new ZipArchiveEntry(path+"/"+file.getName())); IOUtils.copy(new FileInputStream(file), os); os.closeArchiveEntry();
Pour plus de connaissances sur Java, veuillez prêter attention au tutoriel de base Java colonne.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!