existe-t-il un support intégré dans Groovy pour gérer les fichiers Zip (façon groovy)?
Ou dois-je utiliser Java.util.Zip.ZipFile pour traiter les fichiers Zip dans Groovy?
Autant que je sache, il n'y a pas de manière native. Mais consultez cet article sur la manière d’ajouter une méthode .Zip(...)
à File, ce qui serait très proche de ce que vous recherchez. Vous devez juste créer une méthode .unzip(...)
.
Peut-être que Groovy n’a pas de support «natif» pour les fichiers Zip, mais il est toujours assez simple de travailler avec eux.
Je travaille avec des fichiers Zip et voici une partie de la logique que j'utilise:
def zipFile = new Java.util.Zip.ZipFile(new File('some.Zip'))
zipFile.entries().each {
println zipFile.getInputStream(it).text
}
Vous pouvez ajouter une logique supplémentaire en utilisant une méthode findAll
:
def zipFile = new Java.util.Zip.ZipFile(new File('some.Zip'))
zipFile.entries().findAll { !it.directory }.each {
println zipFile.getInputStream(it).text
}
D'après mon expérience, la meilleure façon de procéder consiste à utiliser Antbuilder:
def ant = new AntBuilder() // create an antbuilder
ant.unzip( src:"your-src.Zip",
dest:"your-dest-directory",
overwrite:"false" )
De cette façon, vous n'êtes pas responsable de tout ce qui est compliqué - Ant en prend soin pour vous. Évidemment, si vous avez besoin de quelque chose de plus granulaire, cela ne fonctionnera pas, mais pour la plupart des scénarios «décompressez simplement ce fichier», cela est vraiment efficace.
Pour utiliser antbuilder, incluez simplement ant.jar et ant-launcher.jar dans votre chemin de classe.
Le projet d’extension commune Groovy fournit cette fonctionnalité à Groovy version 2.0 et supérieure: https://github.com/timyates/groovy-common-extensions
Cet article développe l'exemple AntBuilder.
http://preferisco.blogspot.com/2010/06/using-goovy-antbuilder-to-Zip-unzip.html
Cependant, en principe, existe-t-il un moyen de connaître l'ensemble des propriétés, fermetures, cartes, etc. pouvant être utilisés lors de la recherche d'une nouvelle facette dans groovy/java? des choses utiles, mais comment débloquer leurs trésors cachés? Les fonctions de code complet de NetBeans/Eclipse semblent maintenant désespérément limitées dans la nouvelle richesse linguistique que nous avons ici.
Décompressez à l'aide d'AntBuilder est un bon moyen.
La deuxième option est d’utiliser une bibliothèque tierce - Je recommande Zip4j
Bien que je pose la question un peu dans une autre direction, j’ai commencé à utiliser Groovy pour un DSL que je construisais, mais j’ai fini par utiliser Gradle comme point de départ pour mieux gérer une grande partie des tâches basées sur des fichiers que je voulais effectuer (par exemple, ., décompressez et décompressez les fichiers, exécutez d’autres programmes, etc.). Gradle s'appuie sur ce que groovy peut faire et peut être étendu via des plugins.
// build.gradle
task doUnTar << {
copy {
// tarTree uses file ext to guess compression, or may be specific
from tarTree(resources.gzip('foo.tar.gz'))
into getBuildDir()
}
}
task doUnZip << {
copy {
from zipTree('bar.Zip')
into getBuildDir()
}
}
Ensuite, par exemple (ceci extrait les bar.Zip
et foo.tgz
dans le répertoire build
):
$ gradle doUnZip
$ gradle doUnTar
Les méthodes groovy ci-dessous seront décompressées dans un dossier spécifique (dossier C: \). J'espère que cela t'aides.
import org.Apache.commons.io.FileUtils
import Java.nio.file.Files
import Java.nio.file.Paths
import Java.util.Zip.ZipFile
def unzipFile(File file) {
cleanupFolder()
def zipFile = new ZipFile(file)
zipFile.entries().each { it ->
def path = Paths.get('c:\\folder\\' + it.name)
if(it.directory){
Files.createDirectories(path)
}
else {
def parentDir = path.getParent()
if (!Files.exists(parentDir)) {
Files.createDirectories(parentDir)
}
Files.copy(zipFile.getInputStream(it), path)
}
}
}
private cleanupFolder() {
FileUtils.deleteDirectory(new File('c:\\folder\\'))
}