Java BufferedReader:ファイルの読み込み方法(例付き)

⚡ スマートサマリー

Java BufferedReaderは入力ストリームからテキストを文字バッファリングして読み込むため、行ごとのファイル読み込みが高速かつ簡単になります。ping ファイルリーダーの中に BufferedReaderとlooping readLine が null を返すまで、ファイル全体を出力します。

  • ???? 主な目的: BufferedReaderは、読み取り操作にコストがかかるReaderをラップし、基となるストリームに対する個々の読み取り回数を削減します。
  • 🔁 読み取りループ: readLine関数は呼び出しごとに1行を返し、ファイルの末尾ではnullを返すため、その結果に対するwhileループでファイル全体を走査できます。
  • 🧱 脱出経路: A Windows 内部のパス Java 文字列には二重のバックスラッシュが必要です。そうでない場合、コンパイラは無効なエスケープシーケンスを拒否します。
  • ♻️ リソースリリース: リーダーを閉じると、基となるファイルハンドルが解放されます。try-with-resources は、このクローズ処理を自動的に実行します。
  • 特選割️ コンソール入力: ラップping InputStreamReader の System.in を使用すると、同じクラスがファイルではなくキーボード入力を読み取ることができます。
  • <XNUMXxEXNUMX><XNUMXxEXNUMX><XNUMXxXNUMXA><XNUMXxXNUMX><XNUMXxXNUMXA>️️ スキャナーのコントラスト: BufferedReaderは高速で生の行を返すのに対し、Scannerはトークンとプリミティブ型を直接解析します。
  • 🔤 文字セットに関する注意: FileReaderはデフォルトの文字セットを適用するため、明示的に文字セットを指定することで、マシン間で文字化けが発生するのを防ぐことができます。

BufferedReaderの Java

ファイルの読み込み方法 Java?

Java ファイルから読み込むためのいくつかのメカニズムを提供します。このための最も便利なパッケージは java.io腹筋tract Reader このクラスは文字ストリームの読み取りを定義します。 java.io.BufferedReader これは、効率的な行ベースの読み取りに使用される具体的なサブクラスです。

何ですか BufferedReaderの Java?

Bufferエドリーダー   Java ファイルなどの入力ストリームからテキストを読み込むクラスです。文字をバッファリングすることで、文字、配列、行を効率的に読み込むことができます。バッファリングを行わない場合、Reader に対して行われる各読み取り要求は、基となる文字ストリームまたはバイトストリームに対する対応する読み取り要求をトリガーします。

したがって、ラップすることをお勧めします BufferedReader は、あらゆるリーダーの周りにあります。 read() 手術には費用がかかる場合があります。 FileReader (NAIST) と InputStreamReader一般的な使用例では、ファイルパスをリーダーに次のように渡します。

// Note the doubled backslash: a single \ starts an escape sequence
objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));

これにより、ファイルが読み込まれます。 objReader次に、ファイルの内容を順に処理し、各行を出力します。以下のコードのwhileループは、ファイルの末尾に達するまでファイルを読み込みます。

while ((strCurrentLine = objReader.readLine()) != null) {
    System.out.println(strCurrentLine);
}

strCurrentLine 現在の行を保持し、 objReader.readLine() String型を返します。そのため、ループは返された値がnullでない限り繰り返し実行され、最初のnull値で停止します。null値はファイルの終わりを示します。

BufferedReader の例

以下のコードは完全なものです Java BufferedReaderの例:

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

public class ReadFileExample {

    public static void main(String[] args) {
        BufferedReader objReader = null;
        try {
            String strCurrentLine;

            objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));

            while ((strCurrentLine = objReader.readLine()) != null) {
                System.out.println(strCurrentLine);
            }

        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {
                if (objReader != null)
                    objReader.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

注意: その finally ブロックが重要です。それは保証します objReader.close() 例外がスローされたかどうかに関係なく実行され、基となるファイル ハンドルを解放し、 メモリ管理 予測可能。ネストされたtryブロックの中に finally 必要な理由は close() それ自体が宣言する IOException.

BufferedReader JDK7 の例

JDK 7以降では、try-with-resourcesは finally 完全にブロックします。括弧内に宣言されたリソースはすべて try 例外が伝播した場合でも、ブロックが終了すると、作成順とは逆の順序でステートメントは自動的に閉じられます。

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

public class ReadFileExample_jdk7 {

    private static final String FILENAME = "D:\\DukesDiary.txt";

    public static void main(String[] args) {

        try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) {

            String strCurrentLine;

            while ((strCurrentLine = br.readLine()) != null) {
                System.out.println(strCurrentLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

このバージョンはより短く安全なので、新しいコードではこの形式を推奨します。ファイルの読み込みは、このクラスの用途のほんの一例にすぎません。次のセクションでは、初心者が最初に使う代替案と比較します。

BufferedReaderとスキャナー:どちらを使うべきか

どちらのクラスもテキストを読み込むため、初心者はどちらか一方を安易に選択しがちです。しかし、それぞれ解決すべき問題が異なるため、誤った選択をすると、入力テキストが数千行に及ぶようになった際に、手作業による解析が煩雑になったり、処理速度が低下したりするという問題が生じます。以下の表は、両者を比較したものです。

側面 Bufferエドリーダー スキャナー
返品 行全体を文字列として 解析されたトークンとプリミティブ
パース機能が組み込まれています いいえ、あなたは自分自身を分割または変換します はい — nextInt、nextDouble次の行
デフォルトバッファ 8192文字 1024文字
大容量ファイルの処理速度 速く 正規表現によるトークン化のため、処理速度が遅くなる。
スレッドセーフティ Syncホーロナイズド 同期されていません
ベスト 大きなファイルを一行ずつ読み込む 入力値を必要とする小さなインタラクティブな入力

選択する BufferedReader は、ファイルを素早く移動してテキストを自分で処理することが目的の場合に、Scanner は、変換コードを書かずに入力された値が必要な場合に使用します。返された各行を分割して、 文字列分割メソッド 与える BufferedReaderは、Scannerの利便性のほとんどをより高速に提供します。

コンソール入力の読み取り方法 Bufferエドリーダー

同じクラスはキーボード入力を読み取ることができ、これは小規模なコマンドラインプログラムやコーディング課題の入力に役立ちます。 System.in バイトストリームなので、 BufferedReaderに直接。 InputStreamReader バイトを文字に橋渡しし、 BufferedReaderは、その橋渡しの上に効率的な行読み上げ機能を追加します。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadConsoleExample {

    public static void main(String[] args) throws IOException {

        // Bridge the System.in byte stream to a character stream
        try (BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in))) {

            System.out.print("Enter your name: ");
            String name = reader.readLine();

            System.out.print("Enter your age: ");
            // readLine always returns text, so convert it explicitly
            int age = Integer.parseInt(reader.readLine().trim());

            System.out.println("Hello " + name + ", age " + age);
        }
    }
}

覚えておくべき点が3つあります。まず、 readLine() 常に文字列を返すため、数値入力は変換する必要があります。 Integer.parseInt または同様のもので、数値以外の入力はエラーを発生させます。 NumberFormatException — 入力が信頼できない場合は変換をラップします。次に、呼び出します .trim() 末尾のキャリッジリターンを削除します Windows コンソールは追記しますが、これは解析エラーの頻繁な原因となります。3つ目は、ラップされたリーダーを閉じないようにすることです。 System.in プログラムが後でコンソール入力を必要とする場合、ラッパーを閉じると、そのプロセスに対して基となるストリームが完全に閉じられるため、注意が必要です。

多くの値を読み込むプログラムの場合、1行を読み込んで分割する方が、呼び出すよりもはるかに高速です。 readLine() 繰り返し実行されるのは、各呼び出しがバッファが空になったときにのみオペレーティングシステムに渡るためです。これが競技プログラマーが好む主な理由です。 Buffer大量入力にはScannerよりもedReaderの方が適しています。

正しいコードを使用しても、いくつかのエラーが繰り返し発生する。

コマンドと BufferedReaderのエラーとその解決方法

ブリッジ BufferedReaderのエラーは、読み取りループ自体ではなく、ファイルパス、リソース処理、または文字エンコーディングに起因します。以下の各エラーには、その例外と解決策が示されています。

  • 違法な脱出文字: パスにはバックスラッシュが1つ使われます。 "D:\DukesDiary.txt". Double それに "D:\\DukesDiary.txt"またはスラッシュを使用します。 Java 受け入れる Windows.
  • ファイルノットファウンド例外: パスはソースファイルではなく、作業ディレクトリからの相対パスです。 new File(name).getAbsolutePath() どこを見るか Java 実際に探している。
  • 最初の読み取り時に NullPointerException が発生します。 コンストラクタが例外をスローし、その例外が無視されたため、リーダーは割り当てられませんでした。 例外処理 ループの前に。
  • 文字化けまたは疑問符: ファイルはUTF-8ですが FileReader プラットフォームのデフォルト文字セットを適用します。文字セットを明示的に渡すには、たとえば次のようにします。 new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8).
  • ストリームは終了しました: リーダーがループ内で閉じられたか、try-with-resourcesが終了した後に再利用されました。ファイル処理ごとに新しいリーダーを開いてください。

よくあるご質問

はい。コンストラクタの2番目の引数は、バッファを文字単位で設定します。たとえば、 new BufferedReader(reader, 16384)デフォルト値の8192はほとんどのファイルに適しています。この値を上げると、非常に大きなシーケンシャル読み取りの場合にのみ効果があります。

小さなファイルの場合は、はい、1回の呼び出しで行のリストを返します。大きなファイルの場合は、 Files.newBufferedReader or Files.linesreadAllLinesはファイル全体を一度にメモリに保持するためです。

Yes. AI アシスタントはfinallyブロックのクリーンアップ処理をtry-with-resourcesに書き換え、NIOの同等の処理を提案します。生成された変換処理では明示的なエンコーディングが失われることが多いため、後で文字セットと例外処理の動作を確認してください。

AIがスタックを読み取る trace は、原因が作業ディレクトリの誤り、アクセス権限の不足、またはエンコードの不一致のいずれであるかを特定します。診断時間を短縮できますが、修正は実際のファイルに対して検証する必要があります。

いいえ。readLine関数は行末文字を削除するため、返される文字列には末尾の改行文字が含まれません。したがって、ファイル内の空行はnullではなく空の文字列を返します。