2012-04-17 10 views
6

He estado luchando con la lectura de los contenidos de un directorio de recursos en mi proyecto lein. Ahora entiendo (después de hacerlo mal por un tiempo) a utilizar clojure.java.io/resource de sacar un recurso, porque simplemente utilizando el sistema de archivos no funciona cuando se empaqueta como un frasco:clojure: descomprimir un archivo comprimido almacenado como recurso

> (require '[clojure.java.io :as io]) 
> (def zipzip (.openStream (io/resource "zip.zip"))) 

Esto devuelve un BufferedInputStream. Lo que quiero hacer es tomar este archivo zip y descomprimirlo en un directorio local. No puedo hacer un ZipFile, pero puedo hacer un ZipInputStream. Desafortunadamente, aunque puedo obtener ZipEntries de esto, necesito un ZipFile para leer el contenido del ZipEntry. Puedo hacer esto:

> (-> zipzip ZipInputStream. .getNextEntry .getName) 

Esto devuelve el nombre, pero no hay nada en la documentación API para obtener el contenido real de que ZipEntry con el ZipInputStream!

¿Cómo se escribe el contenido de este ZipInputStream en un directorio local? (¡Eso también funciona cuando el código está empaquetado en un contenedor!)

Respuesta

8

Simplemente puede leer en ZipInputStream después de obtener la siguiente entrada. Use la información de tamaño de la entrada para leer el contenido.

user=> (import 'java.util.zip.ZipInputStream) 
java.util.zip.ZipInputStream 
user=> (def zs (ZipInputStream. (io/input-stream "foo.zip"))) 
#'user/zs 
user=> (def ze (.getNextEntry zs)) 
#'user/ze 
user=> (.getName ze) 
"foo.txt" 
user=> (.getSize ze) 
21 
user=> (let [bytes (byte-array 21)] (.read zs bytes 0 21) (String. bytes "UTF-8")) 
"Das ist ein Test!\r\n\r\n" 
Cuestiones relacionadas