Я заметил, что соответствующие функции помечены как устаревшие в 1.2, но у меня также сложилось впечатление, что, как написано, у них есть некоторые ошибки, требующие устранения.
Во-первых, не осуждаемый способ сделать то, что вы пытались сделать (что мне подходит):
(require '[clojure.java.io :as io])
(with-open [w (io/writer (io/file "/path/to/file")
:append true)]
(spit w "Foo foo foo.\n"))
(Пропуск io/file
и простая передача строки в io/writer
тоже подойдут - я предпочитаю использовать обертку частично для личного вкуса и частично, чтобы c.j.io
не пытался обработать строку как URL (в данном случае только для возврата через исключение и поиска файла), что является его первым выбором интерпретации.)
Почему я думаю, clojure.contrib.io
может страдать от ошибки:
(require '[clojure.contrib.io :as cio])
(with-bindings {#'cio/assert-not-appending (constantly true)}
(cio/append-spit "/home/windfall/scratch/SO/clj/append-test.txt" "Quux quux quux?\n"))
Это не жалуется, но и не добавляет к файлу - вместо него заменяется текущее содержимое. Я еще не уверен, в чем именно проблема, но переход на clojure.java.io
должен избежать этого. (Очевидно, что это требует дальнейшего изучения - устаревший код по-прежнему не должен содержать ошибок - я постараюсь выяснить это.)