前回の記事では、Javaの基本的な入出力(I/O)について学んだよね。
Javaでファイル操作をマスターしよう! | ToolDocs
今回はその続きとして、もっと便利にテキストファイルを読み書きする方法を解説するよ! 特に、大量のデータを扱うときに大活躍するBufferedReaderとBufferedWriterについて、具体的な例を交えながら見ていこう。
なんでBufferedReader/BufferedWriterが必要なの?
「え、前回の記事でやったFileReaderとかFileWriterじゃダメなの?」って思った人もいるかもしれないね。もちろん、それでもファイルの読み書きはできるんだけど、これらのクラスは文字を1文字ずつ処理するんだ。
想像してみて。もしあなたが分厚い本を読むときに、1文字ずつしか読めなかったらどうかな? めちゃくちゃ時間がかかるよね? それと同じで、プログラムも1文字ずつ処理すると効率が悪いんだ。特に大きなファイルを扱うときは、処理が遅くなっちゃう。
そこで登場するのがバッファだよ! バッファは、一時的にデータをためておく場所のこと。BufferedReaderやBufferedWriterは、このバッファを使って一度にたくさんのデータを読み込んだり、書き込んだりするんだ。これによって、ファイルの読み書きが格段に速くなるんだよ!
BufferedReaderでテキストファイルを読み込む
まずはBufferedReaderを使ってテキストファイルを読み込む方法から見ていこう。
BufferedReaderは、他のリーダー(FileReaderとか)と組み合わせて使うことで真価を発揮するんだ。例えば、FileReaderでファイルを開いて、それをBufferedReaderに渡すイメージだね。
Java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderExample {
public static void main(String[] args) {
// 読み込むファイル名を指定
String fileName = "sample.txt";
// try-with-resourcesを使って、リソースを自動でクローズする
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
String line;
// ファイルの終端に達するまで1行ずつ読み込む
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// ファイルが見つからない、または読み込み中にエラーが発生した場合
System.err.println("ファイルの読み込み中にエラーが発生しました: " + e.getMessage());
}
}
}
このコードでは、sample.txtというファイルを読み込んでいるよ。
ポイントはここ!
new BufferedReader(new FileReader(fileName)):FileReaderでファイルを開き、それをBufferedReaderに渡している。こうすることで、バッファリングされた読み込みが可能になるんだ。br.readLine():これがBufferedReaderの便利なところ! ファイルから1行ずつ読み込んでくれるんだ。ファイルの終端に達するとnullを返すから、whileループでファイルの最後まで読み込めるってわけ。try-with-resources文:これはJava 7から導入された便利な機能。try (...)の中にBufferedReaderのインスタンスを記述することで、例外が発生しても自動的にリソースをクローズしてくれるんだ。これを使わないと、finallyブロックでclose()メソッドを呼び出す必要があって、コードが複雑になっちゃうから、積極的に使っていこう!

vscodeで実行した結果
BufferedWriterでテキストファイルを書き込む
次に、BufferedWriterを使ってテキストファイルを書き込む方法を見ていこう。これもFileWriterと組み合わせて使うのが一般的だよ。
Java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterExample {
public static void main(String[] args) {
// 書き込むファイル名を指定
String fileName = "output.txt";
// 書き込む内容
String[] lines = {
"これは最初の行です。",
"これは2行目です。",
"Javaのファイル操作は楽しいね!"
};
// try-with-resourcesを使って、リソースを自動でクローズする
try (BufferedWriter bw = new BufferedWriter(new FileWriter(fileName))) {
for (String line : lines) {
bw.write(line); // 行を書き込む
bw.newLine(); // 改行を追加
}
System.out.println("ファイルに書き込みが完了しました: " + fileName);
} catch (IOException e) {
// ファイルの書き込み中にエラーが発生した場合
System.err.println("ファイルの書き込み中にエラーが発生しました: " + e.getMessage());
}
}
}
このコードでは、output.txtというファイルに3行のテキストを書き込んでいるよ。
ポイントはここ!
new BufferedWriter(new FileWriter(fileName)):FileWriterでファイルを開き、それをBufferedWriterに渡している。これでバッファリングされた書き込みができるようになる。bw.write(line):指定した文字列をファイルに書き込むメソッド。bw.newLine():これが超便利! 環境に応じた改行コードを自動で追加してくれるんだ。Windowsだと\r\n、Unix/Linuxだと\nといったように、OSによって改行コードが違うんだけど、newLine()を使えばそれを意識する必要がないんだ。try-with-resources文:ここでもリソースの自動クローズのために使っているね。

vscodeで実行した結果
appendモードで追記する
FileWriterのコンストラクタには、ファイルに追記するかどうかを指定するオプションがあるんだ。これを使えば、既存のファイルに新しい内容を追加できるよ。
Java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class FileAppendExample {
public static void main(String[] args) {
String fileName = "output.txt";
String newLine = "これは新しく追加される行です。";
// trueを渡すと、ファイルが存在すれば追記モードになる
try (BufferedWriter bw = new BufferedWriter(new FileWriter(fileName, true))) {
bw.newLine(); // 新しい行を追加する前に改行
bw.write(newLine);
System.out.println("ファイルに追記が完了しました: " + fileName);
} catch (IOException e) {
System.err.println("ファイルの追記中にエラーが発生しました: " + e.getMessage());
}
}
}
new FileWriter(fileName, true)のtrueがポイント! これをtrueにすると、もしoutput.txtがすでに存在していれば、そのファイルの末尾に追記されるんだ。もしfalse(または省略)だと、ファイルが存在する場合は上書きされちゃうから気を付けてね!
エラーハンドリングはやっぱり大事!
これまでの例でも見てきたように、ファイルの読み書きではIOExceptionという例外が発生する可能性があるんだ。ファイルが見つからなかったり、書き込み中にディスクがいっぱいになったり、いろんな問題が考えられるからね。
だから、必ずtry-catchブロックで例外を適切にハンドリングすることが重要だよ。try-with-resourcesを使えば、リソースのクローズ忘れは心配ないけど、どんなエラーが起きたかはcatchブロックでしっかり処理してあげよう。
もっと詳しく知りたい人は
今回の内容で、「もっとJavaの入出力について知りたい!」って思った人は、前回の記事も参考にしてみてね。
Javaでファイル操作をマスターしよう! | ToolDocs

vscodeで実行した結果
まとめ
今回はBufferedReaderとBufferedWriterを使ったテキストファイルの読み書きについて学んだね。
BufferedReaderとBufferedWriterはバッファを使ってファイルの読み書きを高速化する。BufferedReader.readLine()で1行ずつ読み込める。BufferedWriter.write()で書き込み、BufferedWriter.newLine()で改行を挿入できる。FileWriterのコンストラクタにtrueを渡すことで追記モードにできる。try-with-resources文を使うと、リソースの自動クローズができて便利。- ファイルの読み書きでは
IOExceptionが発生する可能性があるので、例外ハンドリングは必須。
これらの知識があれば、Javaでテキストファイルを効率的に扱うことができるようになるよ! ぜひ色々なプログラムで試してみてね。
何か質問はあるかな?


コメント