Descomprimir archivo con Groovy

¿Existe un soporte integrado en Groovy para manejar archivos Zip (la forma groovy)?

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

AFAIK, no hay una manera nativa. Pero echa un vistazo a este artículo sobre cómo agregarías un método .zip(...) al archivo, que sería muy parecido a lo que estás buscando. Solo necesitas hacer un .unzip(...) .

Tal vez Groovy no tiene soporte ‘nativo’ para archivos zip, pero todavía 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 } 

Puedes agregar lógica adicional usando 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 } 

En mi experiencia, la mejor manera de hacer esto es usar 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 es responsable de hacer todas las cosas complicadas, Ant se encarga de eso 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’ es realmente efectivo.

Para usar antbuilder, solo incluye ant.jar y ant-launcher.jar en tu classpath.

El proyecto de extensión común Groovy proporciona esta funcionalidad para Groovy 2.0 y superior: https://github.com/timyates/groovy-common-extensions

Este artículo se expande en el ejemplo de AntBuilder.

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

Sin embargo, como cuestión de principio, ¿hay una manera de averiguar todas las propiedades, cierres, mapas, etc. que se pueden usar al investigar una nueva faceta en groovy / java? Parece que hay un montón de cosas realmente útiles, pero ¿cómo desbloquear sus tesoros ocultos? Las características de código completo de NetBeans / Eclipse ahora parecen irremediablemente limitadas en la nueva riqueza lingüística que tenemos aquí.

Descomprimir usando AntBuilder es una buena manera.
La segunda opción es usar una biblioteca de terceros. Recomiendo Zip4j

Aunque tomé la pregunta un poco en otra dirección, comencé a usar Groovy para un DSL que estaba creando, pero terminé usando Gradle como punto de partida para manejar mejor muchas de las tareas basadas en archivos que quería hacer (por ejemplo, ., descomprima y descomprima archivos, ejecute otros progtwigs, etc). Gradle se basa en lo que Groovy puede hacer, y se puede extender 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() } } 

Luego, por ejemplo (esto extrae bar.zip y foo.tgz en la build del directorio):

 $ gradle doUnZip $ gradle doUnTar 

Los siguientes métodos groovy se descomprimirán en una carpeta específica (carpeta C: \). 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\\')) } 
 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() }