Tech Bytes

短くて分かりやすい技術情報を記事として共有します。みなさんにとって学びになれば幸いです。

JavaのStreamReaderの処理方式と書き方

JavaのStreamReaderとは

JavaのStreamReaderは、java.ioパッケージに属するクラスの一部で、テキストファイルからテキストデータを読み取るためのストリームリーダーを提供します。
主に文字セットの変換やテキストデータの読み取りを効率的に行うために使用されます。

StreamReaderは、Readerクラスのサブクラスであり、InputStreamReaderクラスを拡張しています。
これにより、バイトストリームから文字ストリームへの変換が可能になります。

基本的な使用法は次のようになります:

import java.io.*;

public class Example {
    public static void main(String[] args) {
        try {
            // ファイルのパスを指定してFileReaderを作成し、それをInputStreamReaderにラップする
            FileReader fileReader = new FileReader("example.txt");
            InputStreamReader inputStreamReader = new InputStreamReader(fileReader);

            // BufferedReaderを使用してテキストデータを行単位で読み取る
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String line;

            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }

            // リソースを閉じる
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

この例では、FileReaderを使ってファイルからテキストデータを読み取り、それをInputStreamReaderでラップしています。
そして、BufferedReaderを使用して行ごとにデータを読み取り、コンソールに表示しています。
リソースは適切にクローズされるようにtry-with-resources文が使用されています。

InputStreamReaderを使わずにBufferedReaderだけで処理をする方法

BufferedReaderは、Readerをラップしてテキストデータをバッファリングするためのもので、通常はInputStreamReaderと組み合わせて使用されます。
しかし、直接ファイルからBufferedReaderを作成することも可能です。
以下は、FileReaderを使用せずにBufferedReaderだけを使ってファイルを読み取る例です:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Example {
    public static void main(String[] args) {
        String filePath = "example.txt";

        try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath))) {
            String line;

            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (FileNotFoundException e) {
            System.err.println("File not found: " + filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

この例では、BufferedReaderがFileReaderを直接ラップしています。
FileReaderがInputStreamReaderを内部的に使用しているため、実際にはInputStreamReaderが裏で動いていますが、直接それを指定する必要はありません。
BufferedReaderはコンストラクタで与えられたReaderをラップして使用することができます。