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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值