使用Groovy解压缩档案

31

Groovy中是否有内置的支持处理Zip文件的方法(使用groovy的方式)?

还是我必须在Groovy中使用Java的java.util.zip.ZipFile来处理Zip文件?


这个问题/回答还有效吗?这是指哪个版本的Groovy? - serverhorror
9个回答

54

也许 Groovy 没有对 zip 文件的“本地”支持,但是使用它们还是相当容易的。

我正在使用 zip 文件,并且以下是我正在使用的一些逻辑:

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

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

您可以使用findAll方法添加其他逻辑:

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

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

3
谢谢你提醒我,Groovy 的 .text 方法可以代替所有传统的 Java 流处理样板代码。 - Tommy Strand

40

根据我的经验,最好的方法是使用Antbuilder:

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

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

使用这种方式,您不需要自己处理所有复杂的事情——ant会为您处理。显然,如果您需要更细粒度的东西,那么这种方式就行不通了,但对于大多数“只需解压此文件”场景,这种方式非常有效。

要使用antbuilder,只需在类路径中包含ant.jar和ant-launcher.jar即可。


@{Kirk G},你知道按照这种方法是否可以使AntBuilder保持安静(不在屏幕上输出)吗? - Dimitrios Mistriotis
你如何在这里使用模式?如何选择性地解压文件? - Kalpesh Soni
请注意,ant.unzip是现有的ant unzip任务的简单包装器。您提供的参数将直接传递。有关更多信息,请参见https://ant.apache.org/manual/Tasks/unzip.html。 - Brad Lee
这种方法非常缓慢。 - Oleg Sklyar

6
据我所知,目前没有本地的方法。但是请查看文章Powerful Groovy,了解如何向文件添加.zip(...)方法,这将非常接近您要寻找的内容。您只需要创建一个.unzip(...)方法即可。

1
不幸的是,该文章已经从博客中消失了。幸运的是,有一个存档版本。但是更多 Groovy 力量的文章也很好。 - Jazzschmidt

4

4
以下Groovy方法将解压缩到特定文件夹(C:\ folder)。希望这可以帮助您。
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\\'))
}

1

本文扩展了AntBuilder示例。

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

然而,作为一个原则问题 - 是否有一种方法可以找出在研究Groovy/Java中的新方面时可以使用的所有属性、闭包、映射等等呢?似乎有很多非常有用的东西,但如何解锁它们的隐藏宝藏呢?NetBeans/Eclipse代码完成功能现在在这里拥有的新语言丰富性方面似乎已经无望了。


0
虽然有点偏离问题,但我最初使用Groovy构建DSL,但最终选择使用Gradle作为起点来更好地处理我想要执行的许多基于文件的任务(例如解压缩和解包文件,执行其他程序等)。 Gradle在Groovy的基础上进行了扩展,并可以通过插件进一步扩展。
// 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()
    }
}

比如说(这会将 bar.zipfoo.tgz 压缩文件解压到目录 build 中):

$ gradle doUnZip
$ gradle doUnTar

0

使用AntBuilder解压是一个很好的方式。
第二个选项是使用第三方库 - 我推荐Zip4j


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接