我写了这个函数,但它的返回值是什么。
(defn read-data [file]
(let [code (subs (.getName file) 0 3)]
(with-open [rdr (clojure.java.io/reader file)]
(drop 1 (line-seq rdr)))))
(def d (read-data "data.db"))
到现在都没问题。但是当我想打印出来的时候。
(clojure.pprint/pprint d)
我有一个异常(exception):
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Stream closed
所以我很困惑,怎么了?返回值不是列表?作为新手,在这种情况下如何调试?
谢谢!
最佳答案
问题在于 line-seq
是惰性的,并且读取器在评估时已关闭。
这意味着需要在 with-open
的范围内读取所有行。一种选择是使用 line-seq
强制对 doall
进行全面评估,如下所示。
(drop 1 (doall (line-seq rdr)))
这种方法的一个潜在问题是,如果文件大于可用内存,您将收到 OutOfMemoryError。因此,根据您要完成的任务,可能还有其他内存密集程度较低的解决方案。