在魔术中,我需要读入一个很长的文件,这个文件太长了,我想把打开的文件指针传递到方法中,我可以递归地调用它,直到它为空为止。我已经找到了使用open-with的例子,但是有没有一种方法可以打开一个文件,然后在函数中读取它?指向示例或文档会很有帮助。
发布于 2013-08-19 10:48:31
这是否符合您的想法?
(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)))我还应该注意到,在我的示例场景中,它比line-seq上的map或reduce更可取,但是我使用了loop/recur,因为您问到了递归。
在clojure.java.io名称空间上Here's ClojureDocs页面。
发布于 2013-08-19 10:46:20
我发现了答案,所以对于任何其他正在寻找的人来说,这是我的解决方案的一个版本。
(defn transfer
[inFile outFile]
(.write outFile (.read inFile))
...
...
(transfer (clojure.java.io/reader "fileIn.txt)
(clojure.java.io/writer "out.txt"))https://stackoverflow.com/questions/18304890
复制相似问题