2009-03-14 5 views
22

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

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

+0

Действительно ли это все еще действительный вопрос/ответ? Что это за версия Groovy? – serverhorror

ответ

6

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

+0

К сожалению, эта статья исчезла из блога. К счастью [имеется архивная версия] (https://web.archive.org/web/20151120062929/http://blog.xebia.com/2008/05/25/powerful-groovy/). Но статья [More Groovy Power] (http://blog.xebia.com/more-groovy-power/) также хороша. – Jazzschmidt

43

Возможно, Groovy не имеет «родной» поддержки для 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 
} 
+0

+1, чтобы напомнить мне, что Groovy's .text заменяет все традиционные java-потоки, обрабатывающие плиту котла. –

34

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

+0

@ {Kirk G}. Знаете ли вы, что если следовать этому подходу, можно сделать AntBuider тихим (не выводимым на экран)? –

+0

как вы используете шаблоны здесь? как распаковать выборочные файлы? –

+0

Обратите внимание, что ant.unzip - простая оболочка вокруг существующей задачи удаления мусора. Параметры, которые вы даете, просто передаются напрямую. Дополнительную информацию см. В https://ant.apache.org/manual/Tasks/unzip.html. –

1

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

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

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

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

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

0

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

В приведенной ниже заводной методы будут распаковать в определенную папку (C: \ папка). Надеюсь это поможет.