duck-streams

clojure.contrib.duck-streamにはファイル入出力用の便利な関数が定義されている。

; 使用する関数を宣言
(use '[clojure.contrib.duck-streams :only (spit append-spit pwd)])

; ファイルに文字列を出力する。
(spit "hello.txt", "こんにちは、世界!\n")

; ファイルに文字列を追記する。
(append-spit "hello.txt" "こんばんは、世界!\n")

; カレントディレクトリを取得する。
(pwd)

実行結果は次の通り。

user> (spit "hello.txt", "こんにちは、世界!\n")
nil
user> (append-spit "hello.txt" "こんばんは、世界!\n")
nil
user> (pwd)
"c:\\home\\workspace"

でも、何故か c:\home\workspaceにhello.txtは作成されておらず、
emacs起動時のディレクトリ(作業ディレトリ)でc:\homeに作成されていた。

c:/home $ cat hello.txt
こんにちは、世界!
こんばんは、世界!

ちなみに、エンコーディングは *default-encoding* に設定すれば良い。
これは、clojure.contribではなく、clojure.coreで定義されるべきだと思う
のだが、clojure.coreにはエンコーディングに関わるような関数は無いのかな?

ソースを見ると、他にも多数の便利な関数、変数があったのでメモしておく。

関数名 機能
file-str 文字列seqを連結したファイル名とするFileオブジェクトを生成する。
reader InputStream, File, URL, URI, StringオブジェクトよりBufferedReaderを生成する。
writer readerと同様に各種オブジェクトよりPrintWriterを生成する。
append-writer 追記モードのwriter
write-lines 複数行をまとめてファイルに出力する。
read-lines ファイルの中身を全て読み出す。
slurp* Like clojure.core/slurp but opens f with reader.
spit 文字列をファイルへ書き出す。
append-spit 文字列をファイルへ追記する。
pwd カレントディレクトリを取得する。
with-out-writer 任意のオブジェクトより作成したwriterを*out*にbindし、bodyを評価する。
with-in-reader 任意のオブジェクトより作成したPushbackReaderを*in*にbindし、bodyを評価する。
copy Reader/Writer、ストリーム、ファイル間をコピーする。
make-parents ディレクトリを作成する。親ディレクトリが無ければ作成する。
to-byte-array 任意のオブジェクトを*byte-array-type*に変換する
変数 説明
*default-encoding* エンコーディング
*buffer-size* バッファサイズ
*byte-array-type* Type object for a Java primitive byte array.
*append-to-writer* trueでファイル出力時に追記する。