2010-06-02 68 views
11

在Clojure中,如何在包含從Java序列化的浮點值的文件上獲取惰性序列的方式是什麼? (我已經玩過with-open的方法,基於線閱讀的例子,但似乎無法連接點來處理流爲浮動。)將Java浮點文件當作懶惰的Clojure序列處理

謝謝。

+0

每行一個浮點數,或製表符分隔還是空格分隔?你能舉一些例子數據嗎? – 2010-06-02 21:14:53

+0

說明:該文件由Java浮點數的二進制序列化(即簡單類型「float」)組成,它不被任何東西隔開。我想根據(可能非常大的)文件中的每個條目進行計算 - 想象一下,我想總結它們。即我只想在所有的值上都有一個懶惰的序列。 – Cumbayah 2010-06-02 21:36:25

回答

15
(defn float-seqs [#^java.io.DataInputStream dis] 
    (lazy-seq 
    (try 
     (cons (.readFloat dis) (float-seqs dis)) 
     (catch java.io.EOFException e 
     (.close dis))))) 

(with-open [dis (-> file java.io.FileInputStream. java.io.DataInputStream.)] 
    (let [s (float-seqs dis)] 
    (doseq [f s] 
     (println f)))) 

如果您確定要使用整個seq,則不需要使用with-open。

如果您使用with-open,請仔細檢查您是否在其範圍之外泄漏了seq(或派生的seq)。

+0

優雅。謝謝。 – Cumbayah 2010-06-03 07:49:03

+0

好極了:它在我的腦海中啓發了懶惰seq的使用。它最終點擊。 – 2010-06-03 08:03:44