首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中将打开的文件指针传递给函数

在Clojure中将打开的文件指针传递给函数
EN

Stack Overflow用户
提问于 2013-08-19 08:11:01
回答 2查看 197关注 0票数 0

在魔术中,我需要读入一个很长的文件,这个文件太长了,我想把打开的文件指针传递到方法中,我可以递归地调用它,直到它为空为止。我已经找到了使用open-with的例子,但是有没有一种方法可以打开一个文件,然后在函数中读取它?指向示例或文档会很有帮助。

EN

回答 2

Stack Overflow用户

发布于 2013-08-19 10:48:31

这是否符合您的想法?

代码语言:javascript
复制
(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作为直接调用BufferedReaderFileReader的快捷方式。但是,使用with-open仍然更可取-它将确保文件被正确关闭,即使在发生异常的情况下-而且您绝对可以从with-open块中将打开的阅读器传递给其他函数。

以下是如何在您发布的答案中使用的场景中使用with-open,将读取器和写入器对象传递给函数:

代码语言:javascript
复制
(with-open [rdr (io/reader "/path/to/input-file")]
  (with-open [wtr (io/writer "/path/to/output-file")]
    (transfer rdr wtr)))

我还应该注意到,在我的示例场景中,它比line-seq上的mapreduce更可取,但是我使用了loop/recur,因为您问到了递归。

clojure.java.io名称空间上Here's ClojureDocs页面。

票数 2
EN

Stack Overflow用户

发布于 2013-08-19 10:46:20

我发现了答案,所以对于任何其他正在寻找的人来说,这是我的解决方案的一个版本。

代码语言:javascript
复制
(defn transfer
  [inFile outFile]
  (.write outFile (.read inFile))
...

...
(transfer (clojure.java.io/reader "fileIn.txt)
          (clojure.java.io/writer "out.txt"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18304890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档