2012-04-17 13 views
6

के रूप में संग्रहीत एक ज़िप फ़ाइल को अनजिप करना मैं अपने लीन प्रोजेक्ट में संसाधन निर्देशिका की सामग्री को पढ़ने के साथ संघर्ष कर रहा हूं। अब मैं समझ एक संसाधन बाहर निकलने के लिए, क्योंकि सिर्फ फ़ाइल सिस्टम का उपयोग जब यह एक जार के रूप में पैक किया जाता है काम नहीं करता है clojure.java.io/resource उपयोग करने के लिए (गलत कुछ समय के लिए यह करने के बाद):क्लोजर: संसाधन

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

यह BufferedInputStream देता है। मैं जो करना चाहता हूं वह इस ज़िप फ़ाइल को लेना और इसे स्थानीय निर्देशिका में अनपैक करना है। मैं इसमें से ZipFile नहीं बना सकता, लेकिन मैं ZipInputStream बना सकता हूं। दुर्भाग्यवश, जबकि मैं ZipEntries से प्राप्त कर सकता हूं, मुझे ZipEntry की सामग्री को वास्तव में पढ़ने के लिए ZipFile की आवश्यकता है। मैं यह कर सकता:

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

यह नाम देता है, लेकिन एपीआई डॉक्स में कुछ भी नहीं 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"