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

ファイルの読み込み方法 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が終了した後に再利用されました。ファイル処理ごとに新しいリーダーを開いてください。
