Есть ли в Groovy встроенная поддержка для работы с Zip-файлами (отличным способом)?
Или мне нужно использовать Java java.util.zip.ZipFile для обработки файлов Zip в Groovy?
Есть ли в Groovy встроенная поддержка для работы с Zip-файлами (отличным способом)?
Или мне нужно использовать 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
Приведенные ниже классные методы распаковывают в определенную папку (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
и foo.tgz
в каталог build
):
$ gradle doUnZip
$ gradle doUnTar