在 Conjure 中,我需要读入一个长文件,太长而无法插入,我希望将打开的文件指针传递给我可以递归调用的方法,直到它为空。我找到了使用 open-with 的示例,但是有没有办法打开文件,然后在函数内部读取文件?指向示例或文档会有所帮助。
问问题
201 次
2 回答
2
这是否符合您的想法?
(defn process-file [f reader]
(loop [lines (line-seq reader) acc []]
(if (empty? lines)
acc
(recur (rest lines) (conj acc (f (first lines)))))))
(let [filename "/path/to/input-file"
reader (java.io.BufferedReader. (java.io.FileReader. filename))]
(process-file pr-str reader))
请注意,如果您(require '[clojure.java.io :as io])
可以将io/reader
其用作调用的快捷方式BufferedReader
,则可以FileReader
直接使用。但是,使用with-open
仍然是可取的——它可以确保文件被正确关闭,即使在发生异常的情况下——并且您绝对可以将打开的阅读器从with-open
块内传递给其他函数。
这是with-open
您在发布的答案中使用的场景中如何使用的方法,将读取器和写入器对象传递给函数:
(with-open [rdr (io/reader "/path/to/input-file")]
(with-open [wtr (io/writer "/path/to/output-file")]
(transfer rdr wtr)))
我还应该注意,在我的示例场景中,它会优于map
或reduce
优于line-seq
但我使用loop
/recur
因为您询问了递归。
这是命名空间上的 ClojureDocs 页面clojure.java.io
。
于 2013-08-19T02:48:30.823 回答
0
玩弄我发现了答案,所以对于任何其他人来说,这是我的解决方案的一个版本。
(defn transfer
[inFile outFile]
(.write outFile (.read inFile))
...
...
(transfer (clojure.java.io/reader "fileIn.txt)
(clojure.java.io/writer "out.txt"))
于 2013-08-19T02:46:20.317 回答