IO - Alexandria

概要

このページではCommon Lispの汎用ライブラリであるAlexandriaのIOパートについて説明します。

with-input-from-fileマクロ: ファイルの読み込み

with-input-from-file関数は常に:direction:inputで扱うwith-open-fileマクロとほぼ同等です。つまり、入力であることを明示的に扱います。
(alexandria:with-input-from-file (in "test.txt")
  (read-line in nil))
; => "This is a test.";
;    NIL

この例では、"test.txt"というファイルがある前提で、入力を行なっています。

なお、「ほぼ同等」と書いたのは、直接with-open-fileマクロを使用しているのではなく、with-open-file*という内部マクロでラップして使用しているためです。この内部マクロはキーワード引数に:nilをしていした場合、そのキーワード引数は指定しなかったのと同じ扱いとなり、デフォルト値が使用されるという点がANSI標準のwith-open-fileと異なります。

with-output-to-fileマクロ: ファイルへの書き込み

with-output-to-file関数は常に:direction:outputで扱うwith-open-fileマクロとほぼ同等です。つまり、:directionキーワード引数を使わなくてもファイルへの書き込みに使うことができます。

使い方はwith-input-from-fileマクロと同じなので、サンプルは省略します。

read-stream-content-into-string関数: 文字列への一括入力

read-stream-content-into-string関数はストリームを引数に取り、文字列を一括して読み取って返す関数です。
(alexandria:with-input-from-file (in "test.txt")
  (alexandria:read-stream-content-into-string in))
; => "This is a test.
;    これはテスト。
;    "
第2引数は:buffer-sizeというキーワード引数で、デフォルトでは4096に設定されています。特に指定する必要はありません。

read-file-into-string関数: ファイルからの一括入力(文字列)

テキストファイルの内容を文字列として一括入力したい場合はread-file-into-string関数を使うことができます。
(alexandria:read-file-into-string "test.txt")
; => "This is a test.
;    これはテスト。
;    "

テキストファイルの文字符号化方式を指定したい場合は:external-format引数を使用します。ただし、Babelのような文字列処理に特化したライブラリではないので、文字符号化方式の指定方法は各処理系の記述方法に依存します。

write-string-into-file関数: ファイルへの一括出力(文字列)

文字列をテキストファイルに一括して出力するにはwrite-string-into-file関数を使用します。
(alexandria:write-string-into-file "Hello,World" "test2.txt"
                                   :if-exists :supersede)
; => "Hello,World"

ファイルに対するキーワード引数についてはANSI Common Lisp仕様入門の第21章「ストリーム」を参照してください。:supersedeは上書きですが、標準では:errorになっているため、既存の同名ファイルが存在するとエラーになります。

read-file-into-byte-vector関数: ファイルからの一括入力(バイトベクトル)

read-file-into-string関数とよく似ていますが、返り値は文字列ではなくバイトベクトルです。
(alexandria:read-file-into-byte-vector "test.txt")
; => #(84 104 105 115 32 105 115 32 97 32 116 101 115 116 46 10 227 129 147 227 130
;    140 227 129 175 227 131 134 227 130 185 227 131 136 227 128 130 10)

なお、read-stream-content-into-string関数と同様にread-stream-content-into-byte-vector関数も使うことができます。ストリームを別途開いている場合はこちらの関数を使用します。

write-byte-vector-into-file関数: ファイルへの一括出力(バイトベクトル)

こちらはwrite-string-into-file関数のバイトベクトル版です。サンプルは省略します。

copy-file関数: ファイルのコピー

ANSI Common Lispの標準仕様ではファイルのコピーに関する関数が定められていないため、いくつかのライブラリが代わりに提供しています。Alexandriaのcopy-file関数は以下の機能でファイルをコピーします。
  • :element-typeキーワードは'(unsigned-byte 8)を仕様(テキストでもバイナリでもコピーできる)
  • コピー先に同名のファイルが存在する場合は:supersede(上書き)
  • バッファサイズは4096
なお、返り値はコピーしたバイト(オクテット)の数です。
(alexandria:copy-file "test.txt" "test2.txt")
; => 38

0 件のコメント :

コメントを投稿