Распаковать архив с Groovy - PullRequest
25 голосов
/ 14 марта 2009

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

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

Ответы [ 9 ]

47 голосов
/ 15 августа 2009

Возможно, у 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
}
36 голосов
/ 10 февраля 2010

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

6 голосов
/ 14 марта 2009

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

4 голосов
/ 25 апреля 2013

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

1 голос
/ 23 июня 2010

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

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

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

0 голосов
/ 16 ноября 2016

Приведенные ниже 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\\'))
}
0 голосов
/ 27 января 2014

Хотя этот вопрос немного изменился, я начал использовать 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
0 голосов
/ 18 июня 2012

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

0 голосов
/ 25 августа 2011
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()
}
...