テキストファイルの読み書きをマスターしよう! (BufferedReader/BufferedWriter編)

docs

前回の記事では、Javaの基本的な入出力(I/O)について学んだよね。

Javaでファイル操作をマスターしよう! | ToolDocs

今回はその続きとして、もっと便利にテキストファイルを読み書きする方法を解説するよ! 特に、大量のデータを扱うときに大活躍するBufferedReaderBufferedWriterについて、具体的な例を交えながら見ていこう。

なんでBufferedReader/BufferedWriterが必要なの?

「え、前回の記事でやったFileReaderとかFileWriterじゃダメなの?」って思った人もいるかもしれないね。もちろん、それでもファイルの読み書きはできるんだけど、これらのクラスは文字を1文字ずつ処理するんだ。

想像してみて。もしあなたが分厚い本を読むときに、1文字ずつしか読めなかったらどうかな? めちゃくちゃ時間がかかるよね? それと同じで、プログラムも1文字ずつ処理すると効率が悪いんだ。特に大きなファイルを扱うときは、処理が遅くなっちゃう。

そこで登場するのがバッファだよ! バッファは、一時的にデータをためておく場所のこと。BufferedReaderBufferedWriterは、このバッファを使って一度にたくさんのデータを読み込んだり、書き込んだりするんだ。これによって、ファイルの読み書きが格段に速くなるんだよ!

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で実行した結果

まとめ

今回はBufferedReaderBufferedWriterを使ったテキストファイルの読み書きについて学んだね。

  • BufferedReaderBufferedWriterバッファを使ってファイルの読み書きを高速化する。
  • BufferedReader.readLine()1行ずつ読み込める。
  • BufferedWriter.write()で書き込み、BufferedWriter.newLine()改行を挿入できる。
  • FileWriterのコンストラクタにtrueを渡すことで追記モードにできる。
  • try-with-resources文を使うと、リソースの自動クローズができて便利。
  • ファイルの読み書きではIOExceptionが発生する可能性があるので、例外ハンドリングは必須。

これらの知識があれば、Javaでテキストファイルを効率的に扱うことができるようになるよ! ぜひ色々なプログラムで試してみてね。

何か質問はあるかな?

コメント

タイトルとURLをコピーしました