2013-06-29 13 views
5

से बाइट हिस्सों का आलसी अनुक्रम बनाना एक इनपुट स्ट्रीम को देखते हुए मैं बाइट-एरे (भाग) के रूप में डेटा का आलसी अनुक्रम बनाना चाहता हूं। यहाँ मेरी कोशिश है:क्लोजर: इनपुट स्ट्रीम

(defn- read-or-nil [stream] 
    (let [buf (byte-array 2)] 
    (when-not (= -1 (.read stream buf)) 
     buf))) 

(defn byte-chunk-seq [stream] 
    (cons (read-or-nil stream) (lazy-seq (byte-chunk-seq stream)))) 

(with-open [rdr (java.io.FileInputStream. "/tmp/wut")]                                               
    (take 2 (byte-chunk-seq rdr))) 

पिछले बयान में जहाँ मैं कोड का परीक्षण कर रहा हूँ, मैं एक:

IOException स्ट्रीम बंद java.io.FileInputStream.readBytes (FileInputStream.java:-2)

यदि मैं take 1 होने के लिए कथन बदलता हूं तो यह ठीक हो जाता है, लेकिन इससे मुझे बहुत मदद नहीं मिलती है। क्या किसी के पास कोई विचार है कि यह क्यों काम नहीं करेगा?

उत्तर

4

कुछ मुद्दे हैं।

सबसे पहले, आपका आलसी अनुक्रम पूरी तरह से सही नहीं है। फ़ंक्शन का पूरा शरीर lazy-seq में लपेटकर होना चाहिए, और अनुक्रम को जारी रखने के लिए इसे या तो इसे समाप्त करने के लिए या तो इसे समाप्त करना चाहिए।

(defn byte-chunk-seq [stream] 
    (lazy-seq (if-let [buf (read-or-nil stream)] 
       (cons buf (byte-chunk-seq stream)) 
       nil))) 

दूसरा, take भी आलसी है। तो आलसी अनुक्रम को तब तक महसूस नहीं किया जा रहा है जब तक with-open ने स्ट्रीम बंद कर दिया हो। स्ट्रीम बंद होने से पहले इसे महसूस करने के लिए आलसी अनुक्रम के चारों ओर doall लपेटकर आप इस त्रुटि से बच सकते हैं।

(with-open [rdr (java.io.FileInputStream. "/tmp/wut")] 
    (doall (take 2 (byte-chunk-seq rdr)))) 
संबंधित मुद्दे