Java 使用Groovy解压归档文件

Java 使用Groovy解压归档文件,java,groovy,zip,unzip,Java,Groovy,Zip,Unzip,Groovy中是否有处理Zip文件的内置支持(Groovy方式) 或者我必须在Groovy中使用Java的Java.util.zip.ZipFile来处理zip文件吗?好吧,没有本地方式。但请查看如何将.zip(…)方法添加到文件中,这将非常接近您要查找的内容。您只需要创建一个.unzip(…)方法。Groovy可能没有对zip文件的“本机”支持,但使用它们仍然非常简单 我正在处理zip文件,下面是我使用的一些逻辑: def zipFile = new java.util.zip.ZipFile

Groovy中是否有处理Zip文件的内置支持(Groovy方式)


或者我必须在Groovy中使用Java的Java.util.zip.ZipFile来处理zip文件吗?

好吧,没有本地方式。但请查看如何将
.zip(…)
方法添加到文件中,这将非常接近您要查找的内容。您只需要创建一个
.unzip(…)
方法。

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
}

根据我的经验,最好的方法是使用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。

本文将对antbuilder示例进行扩展

然而,作为一个原则问题,是否有一种方法可以找出在groovy/java中研究新方面时可以使用的所有属性、闭包、映射等?
似乎有很多真正有用的东西,但如何打开它们隐藏的宝藏呢?NetBeans/Eclipse代码的完整特性现在似乎在我们这里拥有的新语言丰富性中受到了无可救药的限制

使用AntBuilder解压是一个好方法。
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()
}

第二种选择是使用第三方库-我建议Groovy公共扩展项目为Groovy 2.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()
    }
}

下面的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\\'))
}

@{Kirk G}。您知道如果采用这种方法,有可能使AntBuider保持安静(而不是输出到屏幕)?您如何在这里使用模式?如何解压选择性文件?请注意,ant.unzip是现有ant解压任务的简单包装器。您提供的参数只需直接传递。有关更多信息,请参阅。这种方法非常慢,因为它提醒我groovy的.text取代了所有传统的java流处理模板。这仍然是一个有效的问题/答案吗?这也是指什么Groovy版本?不幸的是,那篇文章从博客上消失了。幸运的是但这篇文章也很好。
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\\'))
}