10
votes

Utilitaire pour décompresser une archive entière à un répertoire de Java

J'aimerais faire quelque chose comme ça dans mon programme:

File zipFile = .....;
File destDir = ....;    
ImaginaryZipUtility.unzipAllTo(zipFile, destdir);


2 commentaires

J'ai ajouté cela comme une demande de fonctionnalité à Apache Commons-Compress: Problèmes.apache.org/jira / Parcourir / Compress-118


Nous avons maintenant 2011 et il n'y a même pas une bibliothèque 3ème partie (commune) pour extraire un zip en Java avec un seul appel? Wtf


4 Réponses :


1
votes

Eh bien, Java.util .zip a des cours pour faire ce que vous voulez de manière très droite


3 commentaires

Je sais, mais ce n'est pas ce que je voulais dire. Voir le commentaire sur la réponse de Jsshah ci-dessous.


Je ne pouvais trouver aucun doublure là-bas. Est-ce que je manque quelque chose, @helios?


Non, pas de doublures, juste des outils à mettre en œuvre de manière très droite, ce qui est recherché. Lisez un fichier ZIP (ses entrées), pour chaque entrée Make Dir, Ouvrir le fichier, le contenu de la part et fermer. Ce que Jshah propose, mais peut-être un peu plus compact (et en utilisant les flux ).



7
votes

Très ancien code que j'ai pu creuser xxx


5 commentaires

Merci, vous deux, mais ce n'est pas ce que je voulais dire. Je sais qu'il est possible de traverser les entrées zip, de créer les répertoires nécessaires et donc d'utiliser l'API STD. Je ne veux pas tout ça dans mon programme. C'est trop de code: c'est moche et déroutant. Cela ne devrait pas être nécessaire pour tous les programmes qui souhaitent décompresser des fichiers pour inclure tout ce genre de choses. Je veux une commande à une seule ligne pour décompresser une archive, comme vous le feriez sur la ligne de commande. Il est difficile de croire que la classe ZipFile n'a pas de méthode unzipto (répertoire). Au lieu de cela, cela nécessite 50 lignes pour faire la même chose. Qu'est-ce que c'est pour la conception de l'API?


Hmm. Peut-être que je devrais essayer ceci: runtime.getruntime (). Exec (nouvelle chaîne [] {"unip", zipfile.getabsolutepath (), "-d", destin.getabsolutepath (),});


L'avantage d'utiliser une JavaClass est la portabilité (vous n'avez pas à vous soucier des binaires natifs)


Pourquoi ne pas ajouter le code ci-dessus comme une classe dans votre projet? Ensuite, vous aurez une solution onine! i.e. ziputtilité.unzipfiles ("/ srcdir", "myzipfile.zip", "/ destination");


@Eirikma: Je pense que les bibliothèques se concentrent sur vous donner les outils généraux et votre application doit les adapter à votre situation. Apache est spécialiste dans la fabrication de classes de services publics (fournissant des méthodes de classes emballées pour mettre en œuvre une utilisation commune des bibliothèques). Je ne connais aucun utilitaire zip (un qui fournit ce que vous voulez). Mais en général, je programmerais un, sauf quelque part comme bibliothèque et utilisez-le. Si je découvre plus tard qu'il y a une utilité acceptée, je peux modifier le code de l'application ou même ma classe d'utilité ad-hoc pour l'utiliser.



0
votes

Il semble que cela soit possible de faire ce que je veux utiliser la bibliothèque TrueZip: https://truezip.dev.java.net/manual-6.html# Copier

Ce n'est pas une situation idéale, puisque la bibliothèque est assez importante et avec une portée plus importante que nécessaire (ainsi que des détails particuliers et déroutants tels que l'être organisé autour des sous-classes de java.io.file également appelé fichier. Pour une utilisation dans des classes qui gère généralement des instances java.io.file!).

Au moins, je ne dois pas être dans une situation où une majorité des lignes de code de la classe ne sont pas liées à la responsabilité de la classe ou de maintenir une classe d'utilité complexe dans le projet sans rapport avec l'objectif du module.

Je pense que c'est un exemple typique sur la raison principale pour laquelle les développeurs expérimentés migrent de Java à Ruby. Malgré une abondance de bibliothèques à Java, trop d'entre eux sont mal conçus de manière à ce que les opérations simples deviennent aussi difficiles à effectuer que les plus spécialisées. On dirait qu'ils sont écrits de bas en haut par des experts en technologie plus désireux d'exposer tous les détails et les possibilités que de faire des tâches quotidiennes simples. Les gens Apache Commons méritent l'honneur de créer des bibliothèques qui soulagent votre classe à partir de lignes de code, en particulier des boucles et des conditionnels, qui ne sont pas liés au but des entreprises de la classe.


2 commentaires

Hmm. Ne fonctionne pas exactement comme je m'y attendais. Il recute dans les fichiers jar à l'intérieur du zip et les extrait également malgré moi en utilisant le code que le manuel dit ne le fera pas. Pas ce que j'avais à l'esprit.


Essayez TrueZip 7. La classe est maintenant appelée TFILE et son API est propre et productive. Si vous aimez l'approche de Ruby, vous pourriez aimer cela aussi.



6
votes

Je sais que je suis, jolie tardive au spectacle, mais je cherchais la même chose et j'ai trouvé cela via Google. La manière la plus simple que j'ai trouvée est la tâche de fourmi "décompress". Vous pouvez l'utiliser sans une configuration de fourmis compliquée (il existe des trucs comme ProjectHelper pour créer un projet de fourmis complet) de votre source Java en incluant xxx pré>

le code pour décompresser un fichier à un répertoire ressemble à CETTE P>

org.apache.ant.compress.taskdefs.Unzip u = new Unzip();
u.setSrc(new File("<archive.zip>"));
u.setDest(new File("<targetDir>"));
u.execute();


0 commentaires