Java FileReaderクラスのガイド

1. 概要

名前が示すように、_https://docs.oracle.com/javase/8/docs/api/java/io/FileReader.html [FileReader] _は、ファイルの内容を読みやすくする* Javaクラスです*。
このチュートリアルでは、_Reader_の基本概念と、Javaで文字ストリームの読み取り操作を行うために_FileReader_クラスを使用する方法を学習します。

2. Reader Basics

_FileReader_クラスのコードを見ると、クラスには_FileReader_オブジェクトを作成するための最小限のコードが含まれており、他のメソッドは含まれていないことがわかります。
これにより、「このクラスの背後にある重荷は誰ですか?」
この質問に答えるには、Javaのhttps://docs.oracle.com/javase/8/docs/api/java/io/Reader.html[_Reader_]クラスの概念と階層を理解する必要があります。
  • _Reader_は、具体的な実装の1つを使用して文字を読み取ることができる抽象基本クラスです。*メモリやファイルシステムなどのメディアから文字を読み取る次の基本操作を定義します。

  • 単一の文字を読む

  • 文字の配列を読み取ります

  • 文字のストリーム内の特定の位置をマークしてリセットします

  • 文字ストリームの読み取り中に位置をスキップ

  • 入力ストリームを閉じます

    当然、_Reader_クラスのすべての実装は、すべての抽象メソッド、つまり_read()_および_close()_を実装する必要があります。 さらに、ほとんどの実装は、他の継承されたメソッドをオーバーライドして、機能を追加したり、パフォーマンスを向上させたりします。

2.1. _FileReader_を使用する場合

_Reader_についてある程度理解したので、_FileReader_クラスに焦点を戻す準備ができました。
_FileReader_は、その機能を_InputStreamReader_から継承します。これは、入力ストリームからバイトを文字として読み取るように設計された_Reader_実装です。
クラス定義でこの階層を見てみましょう:
public class InputStreamReader extends Reader {}

public class FileReader extends InputStreamReader {}
一般に、任意の入力ソースから文字を読み取るために_InputStreamReader_を使用できます。
ただし、ファイルからテキストを読み取る場合、_InputStreamReader_を使用することは、リンゴを剣で切るようなものです。 もちろん、適切なツールはナイフです。これはまさに_FileReader_が約束するものです。
システムのデフォルトの文字セットを使用してファイルからテキストを読み取りたい場合は、* FileReader_を使用できます。*その他の高度な機能については、_InputStreamReader_クラスを直接使用するのが理想的です。

3. _FileReader_を使用してテキストファイルを読み取る

_FileReader_インスタンスを使用して_HelloWorld.txt_ファイルから文字を読み取るコーディング演習を見ていきましょう。

3.1. _FileReader_の作成

便利なクラスとして、* _ FileReader_は、ファイルから入力ソースとして読み取ることができるリーダーを初期化するために使用できる3つのオーバーロードされたコンストラクター*を提供します。
これらのコンストラクターを見てみましょう。
public FileReader(String fileName) throws FileNotFoundException {
    super(new FileInputStream(fileName));
}

public FileReader(File file) throws FileNotFoundException {
    super(new FileInputStream(file));
}

public FileReader(FileDescriptor fd) {
    super(new FileInputStream(fd));
}
この場合、入力ファイルのファイル名を知っています。 したがって、最初のコンストラクターを使用してリーダーを初期化できます。
FileReader fileReader = new FileReader(path);

3.2. 単一の文字を読む

次に、ファイルから文字を1つずつ読み取るメソッド_readAllCharactersOneByOne()_を作成します。
public static String readAllCharactersOneByOne(Reader reader) throws IOException {
    StringBuilder content = new StringBuilder();
    int nextChar;
    while ((nextChar = reader.read()) != -1) {
        content.append((char) nextChar);
    }
    return String.valueOf(content);
}
上記のコードからわかるように、ループ内で* _read()_メソッドを使用して、-1 *が返されるまで文字を1つずつ読み取ります。つまり、読み取る文字がなくなることを意味します。
ここで、ファイルから読み取られたテキストが期待されるテキストと一致することを検証して、コードをテストしましょう。
@Test
public void givenFileReader_whenReadAllCharacters_thenReturnsContent() throws IOException {
    String expectedText = "Hello, World!";
    File file = new File(FILE_PATH);
    try (FileReader fileReader = new FileReader(file)) {
        String content = FileReaderExample.readAllCharactersOneByOne(fileReader);
        Assert.assertEquals(expectedText, content);
    }
}

3.3. 文字の配列の読み取り

継承された_read(char cbuf []、int off、int len)_メソッドを使用して、一度に複数の文字を読み取ることもできます。
public static String readMultipleCharacters(Reader reader, int length) throws IOException {
    char[] buffer = new char[length];
    int charactersRead = reader.read(buffer, 0, length);
    if (charactersRead != -1) {
        return new String(buffer, 0, charactersRead);
    } else {
        return "";
    }
}
配列内の複数の文字を読み取る場合、_read()_の戻り値には微妙な違いがあります。 ここでの*戻り値は、読み取られた文字数、またはリーダーが入力ストリームの最後に達した場合は-1 *のいずれかです。
次に、コードの正確性をテストしましょう。
@Test
public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent() throws IOException {
    String expectedText = "Hello";
    File file = new File(FILE_PATH);
    try (FileReader fileReader = new FileReader(file)) {
        String content = FileReaderExample.readMultipleCharacters(fileReader, 5);
        Assert.assertEquals(expectedText, content);
    }
}

4. 制限事項

_FileReader_クラスはデフォルトのシステム文字エンコーディングに依存していることがわかりました。
そのため、文字セット、バッファサイズ、または入力ストリームに*カスタム値を使用する必要がある状況では、_InputStreamReader_ *を使用する必要があります。
さらに、I / Oサイクルは高価であり、アプリケーションに遅延が発生する可能性があることは誰もが知っています。 したがって、_FileReader_オブジェクトの周りに_https://www.baeldung.com/java-buffered-reader [BufferedReader] _をラップすることにより、* I / O操作の数を最小限に抑えることが最大の関心事です。
BufferedReader in = new BufferedReader(fileReader);

5. 結論

このチュートリアルでは、_Reader_の基本概念と、_FileReader_を使用してテキストファイルの読み取り操作を簡単にする方法をいくつかの例で学びました。
いつものように、チュートリアルの完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-io-2[GitHub]で入手できます。