Unzip Archive avec Groovy

Existe-t-il un support intégré dans Groovy pour gérer les fichiers Zip (De la manière groovy)?

ou dois-je utiliser le java de Java.util.zip.ZipFile pour traiter les fichiers Zip Groovy ?

23
demandé sur mikera 2009-03-14 15:28:54

9 réponses

AFAIK, il n'y a pas de voie autochtone. Mais découvrez cet article sur comment ajouter un .zip(...) méthode de Fichier, ce qui serait très proche de ce que vous cherchez. Vous auriez juste besoin de faire un .unzip(...) méthode.

6
répondu John Feminella 2009-03-14 12:32:35

peut-être que Groovy n'a pas de support 'natif' pour les fichiers zip, mais c'est quand même assez trivial de travailler avec eux.

je suis en train de travailler avec les fichiers zip et les suivants est 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 de la logique en utilisant un findAll méthode:

def zipFile = new java.util.zip.ZipFile(new File('some.zip'))

zipFile.entries().findAll { !it.directory }.each {
   println zipFile.getInputStream(it).text
}
45
répondu Chad Gorshing 2009-08-15 02:26:43

Dans mon expérience, la meilleure façon de le faire est d'utiliser la 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 faire toutes les choses compliquées - fourmi s'en occupe pour vous. Évidemment, si vous avez besoin de quelque chose de plus granulaire, alors cela ne va pas fonctionner, mais pour la plupart des scénarios "décompresser ce fichier", c'est vraiment efficace.

pour utiliser antbuilder, il suffit d'inclure ant.jar et ant-lanceur.un bocal dans le chemin de ta classe.

36
répondu Kirk G 2010-02-10 16:31:15

le projet D'extension commune de Groovy fournit cette fonctionnalité pour Groovy 2.0 et au-dessus:https://github.com/timyates/groovy-common-extensions

4
répondu Andre Steingress 2013-04-25 14:28:36

cet article développe L'exemple D'AntBuilder.

http://preferisco.blogspot.com/2010/06/using-goovy-antbuilder-to-zip-unzip.html

cependant, comme une question de principe - y a-t-il un moyen de découvrir toutes les propriétés, fermetures, cartes etc. qui peuvent être utilisées lors de la recherche d'une nouvelle facette dans groovy/java? Il semble y avoir des tas de choses vraiment utiles, mais comment déverrouiller leurs trésors cachés? Le code NetBeans / Eclipse-les traits complets semblent maintenant désespérément limités dans la nouvelle richesse linguistique que nous avons ici.

1
répondu Merlin 2010-06-23 10:08:27

décompresser avec AntBuilder est une bonne méthode.

La deuxième option est d'utiliser une bibliothèque tierce - je recommande Zip4j

0
répondu bugs_ 2012-06-18 10:46:41

bien que prenant 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 les fichiers que je voulais faire (par ex., décompressez-le et décompresser des fichiers, exécuter 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()
    }
}

Alors, par exemple, des extraits de l' bar.zip et foo.tgz dans le répertoire build):

$ gradle doUnZip
$ gradle doUnTar
0
répondu michael 2014-01-27 18:10:26

les méthodes groovy ci-dessous seront décompressées dans un dossier spécifique (C:\folder). Espérons que cette aide.

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
répondu Ravi Natesh 2016-11-16 15:08:37
def zip(String s){
    def targetStream = new ByteArrayOutputStream()
    def zipStream = new GZIPOutputStream(targetStream)
    zipStream.write(s.getBytes())
    zipStream.close()
    def zipped = targetStream.toByteArray()
    targetStream.close()
    return zipped.encodeBase64()
}
-2
répondu Ganesh Krishnan 2013-07-10 20:49:05