使用Groovy解压缩存档

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

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

AFAIK,没有本土方式。 但请查看这篇文章 ,了解如何向File添加.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即可。

Groovy通用扩展项目为Groovy 2.0及更高版本提供此function: https : //github.com/timyates/groovy-common-extensions

本文对AntBuilder示例进行了扩展。

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

但是,作为一个主体问题 – 是否有办法找出在研究groovy / java中的新方面时可以使用的所有属性,闭包,映射等? 似乎有很多非常有用的东西,但如何解锁他们隐藏的宝藏? 现在,NetBeans / Eclipse代码完整function在我们这里拥有的新语言丰富性方面似乎无可救药地受到限制。

使用AntBuilder解压缩是一种很好的方法。
第二种选择是使用第三方库 – 我推荐使用Zip4j

虽然将问题转移到另一个方向,但我开始使用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 

下面的groovy方法将解压缩到特定的文件夹(C:\文件夹)。 希望这可以帮助。

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