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?
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.
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
}
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.
Das gemeinsame Groovy-Erweiterungsprojekt bietet diese Funktionalität für Groovy 2.0 und höher: https://github.com/timyates/groovy-common-extensions
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.
Das Entpacken mit AntBuilder ist eine gute Möglichkeit.
Die zweite Option ist die Verwendung einer Drittanbieter-Bibliothek. Ich empfehle Zip4j
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
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\\'))
}