2012-04-17 72 views
6

我一直在努力閱讀我的lein項目中資源目錄的內容。我現在明白了使用clojure.java.io/resource拉了資源,因爲只是用文件系統,當它被打包爲一個jar不起作用(做錯了一段時間後):clojure:解壓縮存儲爲資源的zip文件

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

這會返回一個BufferedInputStream。我想要做的就是把這個zip文件解壓縮到本地目錄。我無法制作一個ZipFile,但我可以製作一個ZipInputStream。不幸的是,儘管我可以得到ZipEntries,但我需要一個ZipFile來實際讀取ZipEntry的內容。我可以這樣做:

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

這將返回的名字,但並沒有什麼API文檔與ZipInputStream來獲取ZipEntry的實際內容!

如何將此ZipInputStream中的內容寫出到本地目錄? (當代碼打包成罐子時也可以)!

回答

8

在獲得下一個條目後,您可以簡單閱讀ZipInputStream。使用條目中的大小信息來閱讀內容。

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"