Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Может быть, 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
}

Ответ 3

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

Ответ 5

В этой статье раскрывается пример AntBuilder.

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Ниже 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\\'))
}

Ответ 9

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()
}