2012-04-17 16 views
6

Mam problem z odczytaniem zawartości katalogu zasobów w moim projekcie lein. Rozumiem teraz (po zrobieniu to źle na chwilę) do korzystania clojure.java.io/resource wyciągnąć zasób, ponieważ tylko przy użyciu systemu plików nie działa, gdy jest zapakowany w słoiku:clojure: rozpakowywanie pliku zip przechowywanego jako zasób

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

To zwraca wartość BufferedInputStream. Co chcę zrobić, to wziąć ten plik zip i rozpakować go do lokalnego katalogu. Nie mogę z tego zrobić ZipFile, ale mogę utworzyć ZipInputStream. Niestety, podczas gdy mogę uzyskać ZipEntries z tego, potrzebuję ZipFile, aby rzeczywiście przeczytać zawartość ZipEntry. Mogę to zrobić:

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

ta zwraca nazwę, ale nie ma nic w docs API, aby uzyskać rzeczywiste zawartość tego ZipEntry z ZipInputStream!

Jak zapisać zawartość z tego ZipInputStream do katalogu lokalnego? (Działa to również, gdy kod jest pakowany do słoika!).

Odpowiedz

8

Po przeczytaniu następnego wpisu można po prostu przeczytać z ZipInputStream. Użyj informacji o rozmiarze z pozycji, aby przeczytać zawartość.

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" 
Powiązane problemy