Clojure 读写文件

Clojure读取文件

####简单读文件(slurp)

最简单的读取文件可以采用slurp,主要作用是读取文件并以字符串的形式返回文件内容,因为其将文件直接存入内存,此方法适用于小文件的读取。

1
(slurp "test.file")

在repl里面可以直接打印出字符串内容。

Clojure IO标准库

Clojure中的文件io包装在标准库clojure.java.io包中,我们用reader进行文件读取。

1
2
3
4
5
6
7
8
9
10
(ns reader.read-file
(:require [clojure.java.io :as io]))

(def testfile (io/file "E:/hack/clojure-cook/src/reader/snake.clj"))
(with-open [rdr (io/input-stream testfile)]
(loop [c (.read rdr)]
(if (not= c -1)
(do
(+ x c)
(recur (.read rdr))))))

这段代码里用到了两个重要的函数,file和reader。file函数主要获取java.io.File对象。可以使用以下方法来获取file对象。

1
2
3
4
5
6
7
8
(ns reader.file-demo
(:require [clojure.java.io :as io]))

(def f (io/file "E:/hack/clojure-cook/src/reader/snake.clj"))

(def data-f
(io/file
(io/resource "snake.clj)))

其中resource是从项目读取资源,需要在project.clj中配置资源的文件夹:

1
:resource-paths ["E:/hack/clojure-cook/src/reader"]

使用java io

除了读取本地文件,也可以读取网络信息,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
(ns reader.file-demo
(:require [clojure.java.io :as io])
(:import (java.net URL)
(java.io InputStreamReader BufferedReader)))


(defn fetch-url[address]
(with-open [stream (.openStream (URL. address))]
(let [buf (BufferedReader.
(InputStreamReader. stream))]
(apply str (line-seq buf)))))

(fetch-url "http://www.baidu.com")

##写文件

####简单写文件(split

1
2
3
4
(ns reader.file-demo
(:require [clojure.java.io :as io]))
(def out (io/file "demo.file"))
(spit out "test file")

spit是和slurp相对应的函数,只能进行极小且简单的文件处理,如果进行复杂的文件处理还需要使用Clojure IO库,或者java IO库。

Clojure IO 写文件

1
2
3
4
5
6
7
8
9
10
11
(ns reader.file-demo
(:require [clojure.java.io :as io]))


(def out (io/file "demo.file"))

(defn write-file [content]
(with-open [w (io/writer out)]
(.write w content)))

(write-file "test file second")