2010-06-02 70 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