1. 概要

名前が示すように、 FileReaderJavaクラスであり、ファイルの内容を簡単に読み取ることができます。

このチュートリアルでは、 Reader の基本概念と、FileReaderクラスを使用してJavaの文字ストリームで読み取り操作を実行する方法を学習します。

2. リーダー基本

FileReader クラスのコードを見ると、クラスには FileReader オブジェクトを作成するための最小限のコードが含まれており、他のメソッドは含まれていないことがわかります。

これは、「このクラスの背後にある重労働は誰ですか?」のような疑問を提起します。

この質問に答えるには、JavaのReaderクラスの概念と階層を理解する必要があります。

Readerは、具体的な実装の1つを介して文字を読み取ることを可能にする抽象基本クラスです。メモリやファイルシステムなどの任意のメディアから文字を読み取る次の基本操作を定義します。

  • 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. 単一の文字を読む

次に、 readAllCharactersOneByOne()を作成しましょう。これは、ファイルから一度に1文字ずつ文字を読み取るためのメソッドです。

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オブジェクトの周りにBufferedReaderをラップすることにより、 I/O操作の数を最小限に抑えることが私たちの最大の関心事です。

BufferedReader in = new BufferedReader(fileReader);

5. 結論

このチュートリアルでは、 Reader の基本概念と、 FileReader を使用すると、いくつかの例を使用してテキストファイルの読み取り操作を簡単に実行できることを学びました。

いつものように、チュートリアルの完全なソースコードは、GitHubで入手できます。