1. ホーム
  2. file

[解決済み] Clojure 1.3では、ファイルの読み書きをする方法

2022-04-24 12:24:29

質問

clojure 1.3でのファイルの読み書きの推奨される方法を知りたいのですが。

  1. ファイル全体を読み込む方法
  2. ファイルを一行ずつ読む方法
  3. 新規にファイルを書き込む方法
  4. 既存のファイルに行を追加する方法

解決するには?

ここではテキストファイルのみで、おかしなバイナリーはないと仮定しています。

その1:ファイル全体をメモリに読み込む方法。

(slurp "/tmp/test.txt")

本当に大きなファイルである場合は、推奨されません。

その2:ファイルを一行ずつ読む方法。

(use 'clojure.java.io)
(with-open [rdr (reader "/tmp/test.txt")]
  (doseq [line (line-seq rdr)]
    (println line)))

with-open マクロは、ボディーの最後でリーダーが閉じられるように配慮しています。リーダー機能は、文字列(URLなども可能)を BufferedReader . line-seq は遅延seqを送出します。遅延 seq の次の要素を要求すると、リーダから一行が読み込まれます。

なお、Clojure 1.7以降では、この他に トランスデューサー はテキストファイルの読み込みに使用します。

その3:新しいファイルに書き込む方法。

(use 'clojure.java.io)
(with-open [wrtr (writer "/tmp/test.txt")]
  (.write wrtr "Line to be written"))

もう一度 with-openBufferedWriter は本文の最後で閉じられる。Writerは文字列を BufferedWriter java interopで使用することができます。 (.write wrtr "something").

また spit の反対です。 slurp :

(spit "/tmp/test.txt" "Line to be written")

その4:既存のファイルに行を追加する。

(use 'clojure.java.io)
(with-open [wrtr (writer "/tmp/test.txt" :append true)]
  (.write wrtr "Line to be appended"))

上記と同じですが、今度はappendオプションがあります。

あるいはまた spit の反対です。 slurp :

(spit "/tmp/test.txt" "Line to be written" :append true)

PS: 他の何かではなく、File に対して読み書きしているという事実をより明確にするために、まず File オブジェクトを作成し、それを BufferedReader またはWriterです。

(reader (file "/tmp/test.txt"))
;; or
(writer (file "tmp/test.txt"))

ファイル関数はclojure.java.ioにもあります。

PS2です。 カレントディレクトリ(だから ".")が何であるかを確認できると便利なことがあります。絶対パスを取得するには、2つの方法があります。

(System/getProperty "user.dir") 

または

(-> (java.io.File. ".") .getAbsolutePath)