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.


目录

  • 1 准备
  • 2 方法
    • 2.1 将文件读到字符串中
    • 2.2 一行一行的读取文件
    • 2.3 将字符串写到文件中
    • 2.4 每次向文件中写一行
    • 2.5 检查文件是否存在
    • 2.6 获取给定目录下的文件列表和目录列表
  • 3 更多内容

准备

请注意,在下面的例子中,”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节


你可能感兴趣的:(Clojure)