Распаковать архив с помощью Groovy

Есть ли в Groovy встроенная поддержка для работы с Zip-файлами (отличным способом)?

Или мне нужно использовать Java java.util.zip.ZipFile для обработки файлов Zip в Groovy?


person HaBaLeS    schedule 14.03.2009    source источник
comment
Это все еще актуальный вопрос/ответ? К какой версии Groovy это относится?   -  person Martin M.    schedule 14.10.2016


Ответы (8)


AFAIK, нет родного пути. Но прочтите эту статью о том, как добавить метод .zip(...) в файл, который будет очень близок к тому, что вы ищете. Вам просто нужно сделать метод .unzip(...).

person John Feminella    schedule 14.03.2009
comment
К сожалению, эта статья исчезла из блога. К счастью, есть архивная версия. Но статья More Groovy Power тоже хороша. - person Jazzschmidt; 06.09.2017

Возможно, в 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
}
person Chad Gorshing    schedule 15.08.2009
comment
+1 за напоминание о том, что .text в groovy заменяет всю традиционную шаблонную плиту для обработки потоков Java. - person Tommy Strand; 30.10.2012

По моему опыту, лучший способ сделать это — использовать 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 в путь к классам.

person Kirk G    schedule 10.02.2010
comment
@{Кирк Г}. Знаете ли вы, можно ли, следуя этому подходу, сделать AntBuider тихим (без вывода на экран)? - person Dimitrios Mistriotis; 13.09.2011
comment
как вы используете шаблоны здесь? как разархивировать выборочные файлы? - person Kalpesh Soni; 24.05.2012
comment
Обратите внимание, что ant.unzip — это простая оболочка для существующей задачи ant unzip. Указанные вами параметры просто передаются напрямую. Подробнее см. ant.apache.org/manual/Tasks/unzip.html. Информация. - person Brad Lee; 22.08.2014
comment
Этот подход очень медленный - person Oleg Sklyar; 12.07.2017

Общий проект расширения Groovy предоставляет эту функциональность для Groovy 2.0 и более поздних версий: https://github.com/timyates/groovy-common-extensions

person Andre Steingress    schedule 25.04.2013

Приведенные ниже классные методы распаковывают в определенную папку (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\\'))
}
person Ravi Natesh    schedule 16.11.2016

Эта статья расширяет пример AntBuilder.

http://preferisco.blogspot.com/2010/06/using-goovy-antbuilder-to-zip-unzip.html

Однако, в принципе, есть ли способ узнать все свойства, замыкания, карты и т. д., которые можно использовать при исследовании нового аспекта в groovy/java? Кажется, есть масса действительно полезных вещей, но как разблокировать их спрятанные сокровища? Функции завершения кода NetBeans/Eclipse теперь кажутся безнадежно ограниченными в новом языковом богатстве, которое мы здесь имеем.

person Merlin    schedule 23.06.2010

Разархивируйте с помощью AntBuilder.
Второй вариант — использовать стороннюю библиотеку. Я рекомендую Zip4j.

person bugs_    schedule 18.06.2012

Несмотря на то, что я решил вопрос немного в другом направлении, я начал использовать 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
person michael    schedule 27.01.2014