Unzip Archive avec Groovy
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.
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
}
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.
le projet D'extension commune de Groovy fournit cette fonctionnalité pour Groovy 2.0 et au-dessus:https://github.com/timyates/groovy-common-extensions
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.
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
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\'))
}
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()
}