2009-03-14 20 views
22

czy w Groovy jest wbudowana obsługa plików Zip (sposób groovy)?Rozpakuj archiwum za pomocą Groovy

Czy muszę używać Java java.util.zip.ZipFile do przetwarzania plików Zip w Groovy?

+0

Czy to nadal jest prawidłowe pytanie/odpowiedź? Jaką wersję ma Groovy? – serverhorror

Odpowiedz

6

AFAIK, nie ma rodzimego sposobu. Sprawdź jednak, this article, jak dodać do pliku opcję .zip(...), która byłaby bardzo zbliżona do tego, czego szukasz. Trzeba po prostu wykonać metodę .unzip(...).

+0

Niestety, ten artykuł zniknął z bloga. Na szczęście [istnieje wersja zarchiwizowana] (https://web.archive.org/web/20151120062929/http://blog.xebia.com/2008/05/25/powerful-groovy/). Ale artykuł [More Groovy Power] (http://blog.xebia.com/more-groovy-power/) jest również dobry. – Jazzschmidt

43

Może Groovy nie ma "natywnego" wsparcia dla plików zip, ale praca z nimi jest nadal dość banalna.

pracuję z plików ZIP i po to niektóre z logiką używam:

def zipFile = new java.util.zip.ZipFile(new File('some.zip')) 

zipFile.entries().each { 
    println zipFile.getInputStream(it).text 
} 

Możesz dodać dodatkową logikę użyciu findAll metody:

def zipFile = new java.util.zip.ZipFile(new File('some.zip')) 

zipFile.entries().findAll { !it.directory }.each { 
    println zipFile.getInputStream(it).text 
} 
+0

+1 za przypomnienie mi, że groovy's .text zastępuje wszystkie tradycyjne ścieżki java obsługujące płytę kotła. –

34

W moim doświadczenie, najlepszym sposobem na to jest użycie Antbuildera:

def ant = new AntBuilder() // create an antbuilder 

ant.unzip( src:"your-src.zip", 
      dest:"your-dest-directory", 
      overwrite:"false") 

W ten sposób nie ponoszę odpowiedzialności za wykonanie wszystkich skomplikowanych rzeczy - mrówka troszczy się o ciebie. Oczywiście, jeśli potrzebujesz czegoś bardziej szczegółowego, to nie zadziała, ale dla większości scenariuszy "po prostu rozpakuj ten plik" jest to naprawdę skuteczne.

Aby użyć programu antywirusowego, po prostu dodaj ant.jar i ant-launcher.jar do swojej ścieżki klas.

+0

@ {Kirk G}. Czy wiesz, że jeśli zastosujesz to podejście, możliwe będzie wyciszenie AntBuidera (nie wysyłanie go na ekran)? –

+0

jak używasz tutaj wzorów? jak rozpakować pliki selektywne? –

+0

Należy pamiętać, że ant.unzip jest prostym opakowaniem wokół istniejącego zadania rozpakowywania mrówek. Podane parametry są po prostu przekazywane bezpośrednio. Więcej informacji można znaleźć na stronie https://ant.apache.org/manual/Tasks/unzip.html. –

1

Ten artykuł rozwija się na przykładzie AntBuilder.

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

Jednak w gruncie kapitału - czy jest jakiś sposób, aby dowiedzieć się wszystkie właściwości, zamknięcia, map itp, które można wykorzystać podczas poszukiwania nowego aspekt w Groovy/java? Wydaje się, że jest mnóstwo naprawdę przydatnych rzeczy, ale jak odblokować ukryte skarby? Funkcje pełne kodu NetBeans/Eclipse wydają się teraz beznadziejnie ograniczone w nowym bogactwie językowym, które mamy tutaj.

-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

Rozpakuj za pomocą AntBuilder to dobry sposób.
Drugą opcją jest użycie trzeci biblioteki strona - Polecam Zip4j

0

Chociaż biorąc Pytanie trochę w innym kierunku, Zacząłem używając Groovy do DSL, który budowałem, ale skończyłem używając Gradle jako punktu wyjścia do lepszego radzenia sobie z wieloma zadaniami opartymi na plikach, które chciałem zrobić (np., rozpakować i rozpakować pliki, wykonać inne programy, itp.) . Gradle opiera się na tym, co groovy może zrobić, i może być rozszerzony poprzez wtyczki.

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

Następnie, dla przykładu (to wyodrębnia bar.zip i foo.tgz w katalogu build):

$ gradle doUnZip 
$ gradle doUnTar 
0

poniższych metod porywające będzie rozpakowania do określonego folderu (c: \ folder). Mam nadzieję że to pomoże.

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\\')) 
}