ivaneye.com

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相关函数对其操作.

更多内容

https://github.com/Raynes/fs cheatsheet的I/O节