Groovy 中是否有内置支持来处理 Zip 文件(groovy 方式)?
还是我必须使用 Java 的 java.util.zip.ZipFile 来处理 Groovy 中的 Zip 文件?
也许 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" )
这样你就不用负责做所有复杂的事情了——蚂蚁会替你处理。显然,如果您需要更精细的东西,那么这将不起作用,但对于大多数“仅解压缩此文件”的情况,这确实有效。
要使用 antbuilder,只需在类路径中包含 ant.jar 和 ant-launcher.jar。
AFAIK,没有原生的方式。但是请查看这篇文章,了解如何将.zip(...)
方法添加到 File,这将非常接近您正在寻找的内容。你只需要制定一个.unzip(...)
方法。
Groovy 通用扩展项目为 Groovy 2.0 及更高版本提供了此功能:https ://github.com/timyates/groovy-common-extensions
以下 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\\'))
}
本文扩展了 AntBuilder 示例。
http://preferisco.blogspot.com/2010/06/using-goovy-antbuilder-to-zip-unzip.html
然而,作为一个主要问题 - 有没有办法找出在 groovy/java 中研究新方面时可以使用的所有属性、闭包、映射等?似乎有很多非常有用的东西,但是如何解锁他们隐藏的宝藏呢?现在,NetBeans/Eclipse 代码完整功能在我们这里所拥有的新语言丰富性中似乎受到了无可救药的限制。
使用 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
and提取foo.tgz
到目录中build
):
$ gradle doUnZip
$ gradle doUnTar
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()
}