В Clojure 1.5 появилась возможность работы с конфигами в формате edn(extensible data notation), но я пока использую версию 1.4, поэтому для себя сделал модуль с использованием класса Properties.
Модуль имеет вид:
(ns somens
(:use [clojure.java.io])
(:import (java.util Properties)
(java.io FileOutputStream FileInputStream)))
(defn load-properties [config-file]
(with-open [f (java.io.FileInputStream. (file config-file))]
(doto (Properties.)
(.load f))))
(defn save-properties [#^Properties properties #^String config-file]
(with-open [#^FileOutputStream f (FileOutputStream. (file config-file))]
(.store properties f nil)))
(defn get-property [properties name]
(.getProperty properties name ))
(defn set-property [properties name value]
(.setProperty properties name (str value)))
Пример использования:
конфигурационный файл имеет вид:
$cat conf.prop
a=20
b="test"
Считаем данный файл и выведем параметры:
user> (def conf (load-properties "/home/home/conf.prop"))
#'user/conf
user> (get-property conf "a")
"20"
user> (get-property conf "b")
"test"
А теперь изменим параметры и сохраним:
user> (let [conf (load-properties "/home/home/conf.prop")]
(set-property conf "a" "200")
(set-property conf "b" "600")
(save-properties conf "/home/home/conf.prop"))
nil
$cat conf.prop
#Mon Jun 23 11:18:25 UTC 2013
b=600
a=200