Есть ли встроенная поддержка в Groovy для обработки Zip файлов (путь Groovy)?
Или мне нужно использовать Java java.util.zip.ZipFile для обработки Zip файлов в Groovy?
Есть ли встроенная поддержка в Groovy для обработки Zip файлов (путь Groovy)?
Или мне нужно использовать Java java.util.zip.ZipFile для обработки Zip файлов в Groovy?
AFAIK, нет родного пути. Но проверьте эту статью о том, как добавить метод .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 и выше: 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 кажутся безнадежно ограниченными в новом богатстве языков, который у нас есть.
Разархивировать с помощью 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()
}