web-dev-qa-db-fra.com

Décompressez Archive avec Groovy

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?

24
HaBaLeS

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(...).

6
John Feminella

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
}
46
Chad Gorshing

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.

36
Kirk G

Le projet d’extension commune Groovy fournit cette fonctionnalité à Groovy version 2.0 et supérieure: https://github.com/timyates/groovy-common-extensions

4
Andre Steingress

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. 

1
Merlin

Décompressez à l'aide d'AntBuilder est un bon moyen.
La deuxième option est d’utiliser une bibliothèque tierce - Je recommande Zip4j

0
bugs_

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
0
michael

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\\'))
}
0
Ravi Natesh