Qu'est ce qu'une bonne bibliothèque Java pour compresser/décompresser des fichiers?
J'ai regardé le Zip par défaut de la bibliothèque qui est livré avec le JDK et le Apache de compression libs et je ne suis pas d'accord avec eux pour 3 raisons:
-
Ils sont gonflés et ont mauvaise conception d'API. Je écrire 50 lignes de chaudière plaque de tableau d'octets de sortie, zip d'entrée, fichier des cours d'eau et fermer pertinentes ruisseaux et attraper les exceptions et les déplacer octet tampons sur mon propre? Pourquoi ne puis-je pas avoir une API simple qui ressemble à ceci
Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null)
etZipper.zip(File targetDirectory, String password = null)
qui fonctionne? -
Il semble que la compression, la décompression détruit le fichier de méta-données et la manipulation de passe est cassé.
-
Aussi, toutes les bibliothèques que j'ai essayé ont été 2-3x lent par rapport à la ligne de commande zip outils que j'obtiens avec UNIX?
Pour moi (2) et (3) sont des points mineurs, mais je veux vraiment une bonne testés de la bibliothèque avec une interface de ligne de.
- Autant que je sache, le zip bibliothèques Java utilise sont en code natif sur de nombreuses bibliothèques et de la performance devrait être sensiblement le même. La différence de performances pourrait être la façon dont vous utilisez les données, par exemple par la prise de copies de données avant de l'utiliser.
- Comme pour le #1, c'est parce que tout le monde n'est tout simplement décompresser un fichier vers un répertoire. Si vous êtes toujours en utilisant le même modèle, pourquoi ne pas simplement écrire un utilitaire classe qui encapsule une des autres et ne ce dont vous avez besoin et il suffit d'utiliser ?
- parce que c'est plus facile d'utiliser une bibliothèque que pour écrire du code, le code de test, et la maintenance du code.
- Votre argument est invalide. Regarder le Python zip API: docs.python.org/3/library/zipfile. Vous avez besoin d'1 ligne de code permettant de compresser ou de décompresser des fichiers. Api doit gérer la commune de la cas très bien et je ne vois pas de cas d'utilisation d'un zip API en plus de la compression ou la décompression.
- la compression d'un fichier ou la décompression d'un fichier est un cas particulier de la compression ou la décompression d'un ruisseau. Si votre API ne pas me laisser écrire un ruisseau et au lieu de me fait écrire un flux de données vers un fichier juste pour que je puisse nourrir que de votre API, votre API est le cerveau endommagé.
- Bien, donc faire de la bibliothèque un soutien à la fois les fichiers et les flux. C'est un gaspillage de tous les temps - le mien, le vôtre, le sens, et tous les autres Googlers qui va tomber sur ce que nous avons chacun à mettre en œuvre nos propres Utilitaires Zip. Tout comme il est SEC, il n'y a BAISSE - Ne Répétez pas les Autres Personnes.
- L'utilisation d'Apache Commons Compresser et ZipArchiveInputStream commons.apache.org/proper/commons-compress/zip.html - maven mvnrepository.com/artifact/org.apache.commons/commons-compress
- Je ne comprendrai jamais pourquoi ce genre de questions à se ferment, comme 'hors sujet'. J'ai la réponse que je cherchais. Alors que faire si ses opinions. C'est exactement ce que je veux, quelqu'opinion honnête de vous recommander une bonne bibliothèque pour le travail.
Vous devez vous connecter pour publier un commentaire.
Je sais que sa fin et il y a beaucoup de réponses, mais ce zip4j est l'une des meilleures bibliothèques pour la compression j'ai utilisé. Sa simple (pas de code de chaudière) et peut facilement manipuler mot de passe des fichiers protégés.
La dépendance Maven est:
code new File(getClass().getResource(zipFileName).getPath());
Mais alors que le fichier ne sera pas ouvert et il va conduire à EOFException ou d'une malformation. C'est tout, parce que lorsque vous utilisez maven, vous devez désactiver le filtrage dans maven ressources plugin <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>zip</nonFilteredFileExtension> </nonFilteredFileExtensions> ...Avec Apache Commons-IO's
IOUtils
vous pouvez faire ceci:C'est encore du code réutilisable, mais il a seulement 1 non-exotique dépendance: Commons-IO
close()
il ne fera pas de mal.Extraire le fichier zip et de tous ses sous-dossiers, en utilisant uniquement le JDK:
Les fichiers Zip et tous ses sous-dossiers:
extractFolder(String zipFile,String extractFolder)
Une autre option que vous pouvez vérifier est zt-zip disponible à partir de Maven central et la page du projet à https://github.com/zeroturnaround/zt-zip
Il a la norme d'emballage et de déballage de fonctionnalités (sur les cours d'eau et sur le système de fichiers) + beaucoup de méthodes d'aide à tester pour les fichiers dans une archive ou d'ajouter/supprimer des entrées.
La pleine mise en Œuvre de compresser/Décompresser un Fichier/Dossier avec zip4j
Télécharger le pot de ici, et ajouter pour votre projet de construction de chemin d'accès. Le
class
soufflet permet de compresser et extraire n'importe quel fichier ou dossier, avec ou sans protection par mot de passe-Un très beau projet est TrueZip.
Par exemple (à partir de la site web):
Une autre option est JZlib. Dans mon expérience, il est moins "fichier" centrée sur que zip4J, donc si vous avez besoin de travailler sur la mémoire des gouttes plutôt que les fichiers, vous pouvez prendre un coup d'oeil.
Il y a un exemple complet d'ici pour la compression et décompression de fichiers de manière récursive:
http://developer-tips.hubpages.com/hub/Zipping-and-Unzipping-Nested-Directories-in-Java-using-Apache-Commons-Compress
Avez-vous eu un coup d'oeil à http://commons.apache.org/vfs/ ? Il prétend simplifier beaucoup de choses pour vous. Mais je n'ai jamais utilisé dans un projet.
Moi aussi je suis pas au courant de Java Natif de compression libs autre que le JDK ou Apache Compression.
Je me souviens une fois que nous avons arraché quelques caractéristiques de Apache Ant - ils ont beaucoup d'utils pour la compression /décompression intégré.
Exemple de code avec VFS ressemblerait à: