it-swarm.com.de

Entpacke das Archiv mit Groovy

gibt es in Groovy eine integrierte Unterstützung für den Umgang mit Zip-Dateien (Groovy-Verfahren)?

Oder muss ich Javas Java.util.Zip.ZipFile verwenden, um Zip-Dateien in Groovy zu verarbeiten?

24
HaBaLeS

AFAIK, es gibt keinen einheimischen Weg. Aber lesen Sie in diesem Artikel nach, wie Sie File eine .Zip(...) -Methode hinzufügen, die dem sehr nahe kommt, wonach Sie suchen. Sie müssten lediglich eine .unzip(...) -Methode erstellen.

6
John Feminella

Möglicherweise bietet Groovy keine native Unterstützung für Zip-Dateien, aber es ist ziemlich trivial, damit zu arbeiten.

Ich arbeite mit Zip-Dateien und die folgende Logik verwende ich:

def zipFile = new Java.util.Zip.ZipFile(new File('some.Zip'))

zipFile.entries().each {
   println zipFile.getInputStream(it).text
}

Sie können zusätzliche Logik hinzufügen, indem Sie eine findAll -Methode verwenden:

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

Nach meiner Erfahrung ist die beste Möglichkeit, dies zu tun, die Verwendung des Antbuilder:

def ant = new AntBuilder()   // create an antbuilder

ant.unzip(  src:"your-src.Zip",
            dest:"your-dest-directory",
            overwrite:"false" )

Auf diese Weise sind Sie nicht dafür verantwortlich, all die komplizierten Dinge zu erledigen - ant kümmert sich darum für Sie. Wenn Sie etwas genaueres benötigen, funktioniert dies natürlich nicht, aber für die meisten Szenarien, in denen Sie diese Datei einfach entpacken, ist dies sehr effektiv.

Um antbuilder zu verwenden, fügen Sie einfach ant.jar und ant-launcher.jar in Ihren Klassenpfad ein.

36
Kirk G

Das gemeinsame Groovy-Erweiterungsprojekt bietet diese Funktionalität für Groovy 2.0 und höher: https://github.com/timyates/groovy-common-extensions

4

Dieser Artikel erweitert das AntBuilder-Beispiel.

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

Gibt es jedoch grundsätzlich eine Möglichkeit, alle Eigenschaften, Schließungen, Karten usw. herauszufinden, die bei der Suche nach einer neuen Facette in Groovy/Java verwendet werden können? Es scheint eine Menge wirklich nützlicher Dinge zu geben, aber wie kann man ihre verborgenen Schätze freischalten? Die Code-vollständigen Funktionen von NetBeans/Eclipse scheinen in der neuen Sprachenvielfalt, die wir hier haben, nun hoffnungslos eingeschränkt zu sein.

1
Merlin

Das Entpacken mit AntBuilder ist eine gute Möglichkeit.
Die zweite Option ist die Verwendung einer Drittanbieter-Bibliothek. Ich empfehle Zip4j

0
bugs_

Obwohl ich die Frage ein wenig in eine andere Richtung führte, begann ich mit Groovy für ein DSL, das ich gerade aufbaute, und verwendete schließlich Gradle als Ausgangspunkt, um viele der dateibasierten Aufgaben, die ich ausführen wollte, besser zu bewältigen (z. B. ., entpacken und entpacken Sie Dateien, führen Sie andere Programme aus, etc). Gradle baut auf dem auf, was Groovy kann, und kann über Plugins erweitert werden.

// 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()
    }
}

Dann, zum Beispiel (dies extrahiert den bar.Zip und den foo.tgz in das Verzeichnis build):

$ gradle doUnZip
$ gradle doUnTar
0
michael

Die folgenden groovigen Methoden werden in einen bestimmten Ordner (C:\Ordner) entpackt. Hoffe das hilft.

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