使用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.zip
和foo.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() }