2012-04-17 5 views
6

필자는 필자의 프로젝트에서 resources 디렉토리의 내용을 읽는 데 어려움을 겪고 있습니다. 지금은 이해 단지 파일 시스템을 사용하는이 병으로 포장 될 때 작동하지 않기 때문에, 자원을 꺼내 clojure.java.io/resource를 사용하는 (잠시 잘못하고 후) :clojure : 리소스로 저장된 zip 파일 압축 해제

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

이것은 BufferedInputStream을 반환합니다. 내가하고 싶은 것은이 zip 파일을 가져 와서 로컬 디렉토리에 압축을 푸는 것입니다. ZipFile을 만들 수는 없지만 ZipInputStream을 만들 수 있습니다. 불행히도, 내가 ZipEntries을 얻을 수는 있지만 실제로는 ZipEntry의 내용을 읽으려면 ZipFile이 필요합니다.

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

이이 이름을 반환하지만 ZipInputStream와 그 ZipEntry의 실제 내용을 얻을 수있는 API 문서에 아무것도 없다 :이 작업을 수행 할 수 있습니다!

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"