Med*_*her 5 inputstream clojure lazy-sequences
给定一个输入流,我想以字节数组(块)的形式创建一个懒惰的数据序列.这是我的尝试:
(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)))
Run Code Online (Sandbox Code Playgroud)
在上一个语句中,我正在测试代码,我得到一个:
IOException Stream关闭java.io.FileInputStream.readBytes(FileInputStream.java:-2).
如果我将语句更改为a take 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)))
Run Code Online (Sandbox Code Playgroud)
其次,take也是懒惰。with-open因此,直到关闭流之后,惰性序列才会被实现。您可以通过将doall惰性序列包裹起来以在流关闭之前实现它来避免此错误。
(with-open [rdr (java.io.FileInputStream. "/tmp/wut")]
(doall (take 2 (byte-chunk-seq rdr))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1625 次 |
| 最近记录: |