📜  Clojure-文件I O(1)

📅  最后修改于: 2023-12-03 14:59:56.744000             🧑  作者: Mango

Clojure 文件 I/O

Clojure 是一种适用于 JVM 平台的函数式编程语言。

Clojure 提供了许多用于文件 I/O 的操作函数,让程序员可以方便地读取和写入文件。

读取文件

要读取文件,可以使用 slurp 函数,它会将文件中的内容全部读取到一个字符串中。

(let [filename "example.txt"
      contents (slurp filename)]
  (println contents))

在上面的示例中,slurp 函数将文件 example.txt 中的内容读取到变量 contents 中,并将其打印到控制台上。

如果你想要一行一行地读取文件,可以使用 line-seq 函数,它会返回一个懒序列,使你可以一次读取一行。

(defn read-lines [filename]
  (with-open [rdr (clojure.java.io/reader filename)]
    (doseq [line (line-seq rdr)]
      (println line))))

在上面的示例中,read-lines 函数会打开文件 filename 并一行一行地读取文件。doseq 函数会遍历每个行,将其打印到控制台上。

写入文件

要将字符串写入文件,可以使用 spit 函数。

(let [filename "output.txt"
      contents "Hello, world!"]
  (spit filename contents))

在上面的示例中,spit 函数将字符串 “Hello, world!” 写入到文件 output.txt 中。

如果你想要一行一行地将内容写入文件,则可以使用 line-seq

(defn write-lines [filename lines]
  (with-open [wrt (clojure.java.io/writer filename)]
    (doseq [line lines]
      (.write wrt (str line "\n")))))

在上面的示例中,write-lines 函数会将变量 lines 中的每一行写入到文件中,并在每一行结尾添加换行符。

综合示例

下面是一个示例程序,它会读取一个文件中的每一行,并将其中的英文单词全部转换为小写字母后写入到另一个文件中。

(ns example.core
  (:require [clojure.string :as str]))

(defn lower-case-words [line]
  (->> line
       (str/split #"\W+")
       (map str/lower-case)
       (apply str)))

(defn process-file [input-file output-file]
  (with-open [input (clojure.java.io/reader input-file)
              output (clojure.java.io/writer output-file)]
    (doseq [line (line-seq input)]
      (.write output (lower-case-words line))
      (.write output "\n"))))

(process-file "input.txt" "output.txt")

在上面的示例程序中,lower-case-words 函数会将一个字符串中的英文单词全部转换为小写字母。process-file 函数则会打开输入和输出文件,读取每一行并将其处理后写入到输出文件中。