2012-04-17 18 views
6

Ho avuto difficoltà a leggere il contenuto di una directory di risorse nel mio progetto lein. Capisco ora (dopo facendo male per un po ') da utilizzare clojure.java.io/resource per tirare fuori una risorsa, perché proprio utilizzando il file system non funziona quando viene confezionato come un vaso:clojure: decompressione di un file zip memorizzato come risorsa

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

Restituisce un BufferedInputStream. Quello che voglio fare è prendere questo file zip e decomprimerlo in una directory locale. Non riesco a creare un ZipFile, ma posso creare un ZipInputStream. Purtroppo, mentre posso ottenere ZipEntries di questo, ho bisogno di un ZipFile per leggere effettivamente il contenuto dello ZipEntry. Posso fare questo:

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

Ciò restituisce il nome, ma non c'è nulla nella documentazione API per ottenere il contenuto effettivo di che ZipEntry con la ZipInputStream!

Come si scrive il contenuto da questo ZipInputStream in una directory locale? (Che funziona anche quando il codice è confezionato in un barattolo!)

risposta

8

Si può semplicemente leggere dal ZipInputStream dopo aver ottenuto la voce successiva. Usa le informazioni sulla dimensione dalla voce per leggere il contenuto.

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" 
Problemi correlati