2012-04-17 29 views
6

Tôi đã gặp khó khăn khi đọc nội dung của thư mục tài nguyên trong dự án lein của tôi. Tôi hiểu ngay bây giờ (sau khi thực hiện sai một lúc) để sử dụng clojure.java.io/resource để lấy ra một tài nguyên, vì chỉ sử dụng hệ thống tệp không hoạt động khi nó được đóng gói dưới dạng jar:clojure: giải nén tệp zip được lưu trữ dưới dạng tài nguyên

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

Trả lại số BufferedInputStream. Những gì tôi muốn làm là lấy file zip này và giải nén nó vào một thư mục cục bộ. Tôi không thể thực hiện một số ZipFile trong số đó, nhưng tôi có thể thực hiện một số ZipInputStream. Thật không may, trong khi tôi có thể nhận được ZipEntries trong số này, tôi cần một ZipFile để thực sự đọc nội dung của ZipEntry. Tôi có thể làm điều này:

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

này trả về tên, nhưng không có gì trong tài liệu api để có được nội dung thực tế của ZipEntry rằng với ZipInputStream là!

Làm cách nào để ghi nội dung từ số ZipInputStream này vào thư mục địa phương? (cũng hoạt động khi mã được đóng gói vào một cái bình!)

Trả lời

8

Bạn chỉ cần đọc từ số ZipInputStream sau khi bạn nhận được mục nhập tiếp theo. Sử dụng thông tin kích thước từ mục nhập để đọc nội dung.

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" 
Các vấn đề liên quan