Groovy中是否有内置的支持来处理Zip文件(groovy方式)?
或者我是否必须使用Java的java.util.zip.ZipFile来处理Groovy中的Zip文件?
答案 0 :(得分:47)
也许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
}
答案 1 :(得分:36)
根据我的经验,最好的方法是使用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。
答案 2 :(得分:6)
AFAIK,没有本土方式。但请查看this article,了解如何向File添加.zip(...)
方法,这与您正在寻找的方法非常接近。您只需要制作.unzip(...)
方法。
答案 3 :(得分:4)
Groovy常用扩展项目为Groovy 2.0及更高版本提供此功能:https://github.com/timyates/groovy-common-extensions
答案 4 :(得分:1)
本文对AntBuilder示例进行了扩展。
http://preferisco.blogspot.com/2010/06/using-goovy-antbuilder-to-zip-unzip.html
然而,作为一个主要问题 - 有没有办法找出在研究groovy / java中的新方面时可以使用的所有属性,闭包,映射等? 似乎有很多非常有用的东西,但如何解锁他们隐藏的宝藏? NetBeans / Eclipse代码完整功能现在似乎在我们这里拥有的新语言丰富性方面受到限制。
答案 5 :(得分:0)
使用AntBuilder解压是很好的方法 第二种选择是使用第三方库 - 我建议使用Zip4j
答案 6 :(得分:0)
虽然将问题转移到另一个方向,但我开始使用Groovy作为我正在构建的DSL,但最终使用Gradle作为起点,以更好地处理我想要的许多基于文件的任务do(例如,解压缩和解压缩文件,执行其他程序等)。 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
答案 7 :(得分:0)
以下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\\'))
}
答案 8 :(得分:-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()
}