【问题标题】:Clojure: Creating a lazy sequence of byte chunks from an input streamClojure:从输入流创建一个惰性的字节块序列
【发布时间】:2013-06-29 03:02:23
【问题描述】:

给定一个输入流,我想以字节数组(块)的形式创建一个惰性数据序列。这是我的尝试:

(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 Stream Closed java.io.FileInputStream.readBytes (FileInputStream.java:-2).

如果我将语句更改为take 1,那么它会返回正常,但这对我没有多大帮助。有谁知道为什么这不起作用?

【问题讨论】:

    标签: clojure inputstream lazy-sequences


    【解决方案1】:

    有几个问题。

    首先,您的惰性序列并不完全正确。整个函数体应该被包裹在lazy-seq 中,并且它应该传入 cons 来继续序列,或者传递 nil 来终止它。

    (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))))
    

    【讨论】:

      猜你喜欢
      • 2013-11-28
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2011-06-26
      • 2010-12-08
      相关资源
      最近更新 更多