Angenommen, wir machen hier nur Textdateien und keine verrückten Binärdateien.
Nummer 1: Wie man eine ganze Datei in den Speicher liest.
(slurp "/tmp/test.txt")
Nicht zu empfehlen, wenn es sich um eine wirklich große Datei handelt.
Nummer 2: Wie man eine Datei Zeile für Zeile liest.
(use 'clojure.java.io)
(with-open [rdr (reader "/tmp/test.txt")]
(doseq [line (line-seq rdr)]
(println line)))
Das with-open
Makro sorgt dafür, dass der Leser am Ende des Körpers geschlossen ist. Die Reader-Funktion zwingt eine Zeichenfolge (sie kann auch eine URL usw. ausführen) in eine BufferedReader
. line-seq
liefert eine faule seq. Das Anfordern des nächsten Elements der Lazy Seq führt dazu, dass eine Zeile vom Leser gelesen wird.
Beachten Sie, dass Sie ab Clojure 1.7 auch Wandler zum Lesen von Textdateien verwenden können.
Nummer 3: Wie schreibe ich in eine neue Datei?
(use 'clojure.java.io)
(with-open [wrtr (writer "/tmp/test.txt")]
(.write wrtr "Line to be written"))
Auch hier ist darauf zu with-open
achten, dass das BufferedWriter
am Ende des Körpers geschlossen ist. Der Writer erzwingt einen String in einen BufferedWriter
, den Sie über Java Interop verwenden:(.write wrtr "something").
Sie könnten auch spit
das Gegenteil von verwenden slurp
:
(spit "/tmp/test.txt" "Line to be written")
Nummer 4: Fügen Sie eine Zeile an eine vorhandene Datei an.
(use 'clojure.java.io)
(with-open [wrtr (writer "/tmp/test.txt" :append true)]
(.write wrtr "Line to be appended"))
Wie oben, jetzt jedoch mit Option zum Anhängen.
Oder nochmal mit spit
dem Gegenteil von slurp
:
(spit "/tmp/test.txt" "Line to be written" :append true)
PS: Um genauer zu sagen, dass Sie in eine Datei lesen und schreiben und nicht in etwas anderes, können Sie zuerst ein Dateiobjekt erstellen und es dann in ein BufferedReader
oder Writer zwingen :
(reader (file "/tmp/test.txt"))
;; or
(writer (file "tmp/test.txt"))
Die Dateifunktion befindet sich auch in clojure.java.io.
PS2: Manchmal ist es praktisch, das aktuelle Verzeichnis (also ".") Zu sehen. Sie können den absoluten Pfad auf zwei Arten erhalten:
(System/getProperty "user.dir")
oder
(-> (java.io.File. ".") .getAbsolutePath)