Предположим, что здесь мы делаем только текстовые файлы, а не какие-то сумасшедшие бинарные вещи.
Номер 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. Требование следующего элемента lazy seq приводит к строке, читаемой читателем.
Обратите внимание, что начиная с Clojure 1.7, вы также можете использовать преобразователи для чтения текстовых файлов.
Номер 3: как записать в новый файл.
(use 'clojure.java.io)
(with-open [wrtr (writer "/tmp/test.txt")]
(.write wrtr "Line to be written"))
Опять же, with-open
заботится о том, чтобы BufferedWriter
был закрыт на конце тела. Writer приводит строку в BufferedWriter
, которую вы используете, используя взаимодействие с Java: (.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"))
То же, что и выше, но теперь с опцией добавления.
Или снова с spit
, противоположным slurp
:
(spit "/tmp/test.txt" "Line to be written" :append true)
PS: Чтобы быть более точным в том, что вы читаете и записываете в файл, а не что-то другое, вы можете сначала создать объект File, а затем преобразовать его в BufferedReader
или Writer. :
(reader (file "/tmp/test.txt"))
;; or
(writer (file "tmp/test.txt"))
Файловая функция также находится в clojure.java.io.
PS2: Иногда бывает удобно увидеть текущий каталог (так что "."). Вы можете получить абсолютный путь двумя способами:
(System/getProperty "user.dir")
или
(-> (java.io.File. ".") .getAbsolutePath)