2012-04-17 5 views
6

Ich habe mich mit dem Auslesen des Inhalts eines Ressourcenverzeichnisses in meinem Projekt beschäftigt. Ich verstehe jetzt (nach einer Weile es falsch zu machen) clojure.java.io/resource zu verwenden, um eine Ressource zu ziehen, weil nur das Dateisystem mit nicht funktioniert, wenn es als ein Glas verpackt ist:clojure: Entpacken einer als Ressource gespeicherten Zip-Datei

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

Dies gibt eine BufferedInputStream zurück. Ich möchte diese Zip-Datei entpacken und in ein lokales Verzeichnis entpacken. Ich kann kein ZipFile daraus machen, aber ich kann ein ZipInputStream machen. Leider, während ich ZipEntries daraus bekommen kann, brauche ich eine ZipFile, um tatsächlich den Inhalt der ZipEntry zu lesen. Ich kann dies tun:

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

Dieser den Namen gibt, aber es gibt nichts in der API-Dokumentation den tatsächlichen Inhalt dieser ZipEntry mit den ZipInputStream zu bekommen!

Wie schreibe ich den Inhalt von diesem ZipInputStream in ein lokales Verzeichnis? (das funktioniert auch, wenn der Code in ein Glas verpackt ist!)

Antwort

8

Sie können einfach aus dem ZipInputStream lesen, nachdem Sie den nächsten Eintrag bekommen haben. Verwenden Sie die Größeninformationen aus dem Eintrag, um den Inhalt zu lesen.

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" 
Verwandte Themen