Clojure教程-文件处理
本文翻译自Working with Files and Directories in Clojure
本文介绍使用Clojure的clojure.java.io命名空间下的函数以及JDK相关方法来操作文件和目录.
版权:
This work is licensed under a Creative Commons Attribution 3.0 Unported License (including images & stylesheets). The source is available on Github.
准备
请注意,在下面的例子中,"io"是clojure.java.io命名空间的简写引用.请确保你的ns宏包含如下代码:
(:require [clojure.java.io :as io])
或者在REPL中加载了:
(require '[clojure.java.io :as io])
方法
将文件读到字符串中
(def a-long-string (slurp "foo.txt"))
注意,你可以给slurp函数传递url.请看slurp文档
一行一行的读取文件
假设你想针对文件的每行内容调用my-func函数,并返回结果序列:
(with-open [rdr (io/reader "foo.txt")]
(doall (map my-func (line-seq rdr))))
doall函数是必须的,因为map函数返回的是个lazy序列.line-seq返回的每行内容没有是去除了末尾的回车标记的,且空行将返回空字符串.
将字符串写到文件中
(spit "foo.txt"
"A long
multi-line string.
Bye.")
如果foo.txt文件不存在则会创建,如果存在,将会覆盖其内容.如果想追加内容,而不是覆盖:
(spit "foo.txt" "file content" :append true)
每次向文件中写一行
假设你想将vector里的内容写到文件中,每个元素一行:
(with-open [wrtr (io/writer "foo.txt")]
(doseq [i my-vec]
(.write wrtr (str i "\n"))))
检查文件是否存在
(.exists (io/file "filename.txt"))
判断是否是目录:
(.isDirectory (io/file "path/to/something"))
io/file是java.io.File对象(文件或目录).你能直接调用该对象上的方法,包括:
exists 文件是否存在?
isDirectory 文件还是目录?
getName 获取文件名字
getParent 过去文件所在目录名称
getPath 获取文件全路径
mkdir 创建目录
更多内容请查看java.io.File
获取给定目录下的文件列表和目录列表
对于File对象:
(.listFiles (io/file "path/to/some-dir"))
上面的方法返回File对象序列,如果想返回字符串序列:
(.list (io/file "path/to/some-dir"))
所有的结果都是列表形式的,可使用Clojure中的seq相关函数对其操作.