2009-03-14 25 views
22

¿hay compatibilidad incorporada en Groovy para manejar archivos Zip (la forma maravillosa)?Descomprima el archivo con Groovy

¿O tengo que usar Java's java.util.zip.ZipFile para procesar archivos Zip en Groovy?

+0

¿Sigue siendo una pregunta/respuesta válida? ¿A qué versión de Groovy se refiere esto también? – serverhorror

Respuesta

6

AFAIK, no hay una manera nativa. Pero mira this article sobre cómo agregarías un método .zip(...) a File, que sería muy similar a lo que estás buscando. Solo necesitarías hacer un método .unzip(...).

+0

Lamentablemente, ese artículo desapareció del blog. Afortunadamente [hay una versión archivada] (https://web.archive.org/web/20151120062929/http://blog.xebia.com/2008/05/25/powerful-groovy/). Pero el artículo [Más Groovy Power] (http://blog.xebia.com/more-groovy-power/) también es bueno. – Jazzschmidt

43

Tal vez Groovy no tiene soporte "nativo" para archivos zip, pero aún así es bastante trivial trabajar con ellos.

estoy trabajando con archivos zip y la siguiente es parte de la lógica que estoy usando:

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

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

Puede agregar lógica adicional utilizando un método 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 por recordarme que el .text de Groovy reemplaza toda la placa de caldera de manejo de corriente tradicional de Java. –

34

En mi experiencia, la mejor manera de hacerlo es utilizar el Antbuilder:

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

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

De esta manera usted no son responsables de hacer todas las cosas complicadas, la hormiga se ocupa de ello por usted. Obviamente, si necesita algo más granular, esto no va a funcionar, pero para la mayoría de los escenarios de 'solo descomprimir este archivo' esto es realmente efectivo.

Para usar antbuilder, simplemente incluya ant.jar y ant-launcher.jar en su classpath.

+0

@ {Kirk G}. ¿Sabes que si sigues este enfoque, es posible hacer que AntBuider sea silencioso (sin generar resultados en la pantalla)? –

+0

¿cómo se usan los patrones aquí? cómo descomprimir archivos selectivos? –

+0

Tenga en cuenta que ant.unzip es un simple contenedor de la tarea de descompresión de hormigas existente. Los parámetros que das simplemente se pasan directamente. Consulte https://ant.apache.org/manual/Tasks/unzip.html para obtener más información. –

1

En este artículo se amplía el ejemplo de AntBuilder.

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

Sin embargo, como una cuestión de principal - ¿hay una manera de descubrir todas las propiedades, los cierres, mapas, etc que se pueden utilizar cuando la investigación de una nueva faceta en el maravilloso/java? Parece que hay muchas cosas realmente útiles, pero ¿cómo desbloquear sus tesoros escondidos? Las características de código completo de NetBeans/Eclipse ahora parecen irremediablemente limitadas en la nueva riqueza de idioma que tenemos aquí.

-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

Descomprimir con AntBuilder es una buena manera.
La segunda opción es utilizar una biblioteca de terceros - recomiendo Zip4j

0

A pesar de tomar la cuestión un poco en otra dirección, que se ubicó en el usando Groovy para una DSL que estaba construyendo, pero terminé usando Gradle como punto de partida para manejar mejor muchas de las tareas basadas en archivos que quería hacer (por ejemplo, descomprimir y descomprimir archivos, ejecutar otros programas, etc.) . Gradle se basa en lo que Groovy puede hacer, y se puede ampliar aún más a través de complementos.

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

Entonces, por ejemplo (esto extrae el bar.zip y foo.tgz en el directorio build):

$ gradle doUnZip 
$ gradle doUnTar 
0

los siguientes métodos maravilloso descomprimirá en la carpeta específica (C: \ carpeta). Espero que esto ayude.

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