今日の自分を支える 技術→マネジメント

技術職→管理職になりました

【Java】ファイル読み書き

1回で書ききれなそうなので随時更新していくことにする。

基礎的な概念

ストリームとは

データの入出力が行われる機構のこと。
入出力は小川に例えることができ、文字が流れるなら文字ストリーム。バイト列が流れるならバイトストリームと呼ばれる。

フィルタとは

ストリームの途中に挟み込み、変換処理をする部品。
Filter~クラスを継承している必要がある。主なクラス参照。

バッファリングフィルタ

フィルタの中でもよくつかわれるフィルタ。
通常ストリームは1文字、1バイトずつ流れていくがバッファリングフィルタを使うことで、まとまった量のデータが下流に流れるようになり、パフォーマンスがアップする。

主なクラス

クラス名 内容 備考
FileWriter 文字列書き込み 文字ストリーム
FileReader 文字列読み込み 文字ストリーム
FileOutputStream バイト列書き込み バイトストリーム
FileInputStream バイト列読み込み バイトストリーム
BufferedReader 文字列読み込み用フィルタ
BufferedWriter 文字列書き込み用フィルタ
BufferedInputStream バイト列読み込み用フィルタ
BufferedOutputStream バイト列書き込み用フィルタ
CipherOutputStream 暗号化処理フィルタ FilterOutputStreamを継承

ファイル操作

flushメソッド

バッファにしか書き込まれていない情報を、実際にファイルに書き出す。
これをせずにcloseするとファイルに書き込まれていなかったりする。

closeメソッド

ファイルを閉じる。忘れてはいけない。でも書いてないからといってcloseされていないとは限らないので以下参照 tatsuhi10.hatenablog.com

フィルタ方法

フィルタは既に存在するストリームを接続先としてコンストラクタで指定して生成する。フィルタはいくつ使ってもよい。

// ファイル出力ストリームを生成
FileOutputStream fos = new FileOutputStream("data.txt");
// ファイル出力のストリームを下流にもつ暗号化ストリームを生成
CipherOutputStream cos = new CipherOutputStream(fos, algo);
// フィルタが上流なので、上流側のメソッドを呼び出すことでファイルに書き込まれる
cos.write(65);

あとから追加したフィルタのほうが上流になることに注意。
2つのフィルタを追加した場合も、2つ目に追加したフィルタのほうが上流になる。