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でファイル出力時に追記する。 |