使用`line-seq`和`reader`,文件什么时候关闭?

pau*_*doo 6 io clojure lazy-evaluation

我正在使用文本文件读取行(line-seq (reader "input.txt")).然后这个集合传递给我的程序使用.

我担心这可能是糟糕的风格,因为我没有确定性地关闭文件.我想我无法使用(with-open (line-seq (reader "input.txt"))),因为在我遍历整个序列之前,文件流可能会被关闭.

应该lazy-seqreader文件一起避免吗?我应该在这里使用不同的模式吗?

Sea*_*eld 15

由于这并没有真正有一个明确的答案(它在第一个答案的评论中都是混合的),这是它的本质:

(with-open [r (reader "input.txt")]
  (doall (line-seq r)))
Run Code Online (Sandbox Code Playgroud)

这将强制读取整个行序列并关闭文件.然后,您可以传递整个表达式的结果.

处理大型文件时,您可能会遇到内存问题(将整个行序列保存在内存中),这是反转程序时的好主意:

(with-open [r (reader "input.txt")]
  (doall (my-program (line-seq r))))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可能需要也可能不需要doall,具体取决于我的程序返回的内容和/或我的程序是否懒惰地消耗序列.