BufferedReaderという選択肢
コンソール入力を高速に読み取ります
「BufferedReaderという選択肢」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
より高速な読み取り方法
Scannerは便利ですが、大量の入力では比較的低速です。大量のデータを読み取る場合は、java.ioのBufferedReaderのほうが、一度に大きなまとまりを読み取るため、はるかに高速です。
BufferedReaderを作成する
System.inをInputStreamReaderでラップし、さらにBufferedReaderでラップします。ここでは、入力を手動で入力しなくても例を実行できるようにStringReaderを使います。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("Hello"));
System.out.println(reader.readLine());
reader.close();
}
}readLineはStringを返す
readLine()は、行終端文字を含めずに1行全体をStringとして読み取ります。Scannerとは異なり、常にテキストを返すため、数値の解析は自分で行う必要があります。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("first\nsecond"));
System.out.println(reader.readLine());
System.out.println(reader.readLine());
reader.close();
}
}入力の終端ではnullになる
これ以上入力がない場合、readLine()はnullを返します。これが読み取りを停止する合図になります。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("one line"));
System.out.println(reader.readLine());
System.out.println(reader.readLine());
reader.close();
}
}すべての行を読み取る
readLine()がnullでない間ループすると、入力のすべての行を処理できます。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("a\nb\nc"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("> " + line);
}
reader.close();
}
}数値を自分で解析する
readLineはテキストを返すため、数値が必要な場合はInteger.parseIntで変換します。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("42"));
int n = Integer.parseInt(reader.readLine().trim());
System.out.println(n * 2);
reader.close();
}
}行をトークンに分割する
1行から複数の数値を読み取るには、splitで行を分割し、それぞれの部分を解析します。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new StringReader("10 20 30"));
String[] parts = reader.readLine().split(" ");
int sum = 0;
for (String p : parts) {
sum += Integer.parseInt(p);
}
System.out.println(sum);
reader.close();
}
}検査例外
readLineは検査例外であるIOExceptionを宣言するため、throws IOExceptionを宣言するか、呼び出しをtry-catchで囲む必要があります。Scannerではこの処理は必要ありません。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new StringReader("data"));
System.out.println(reader.readLine());
reader.close();
} catch (IOException e) {
System.out.println("Read error");
}
}
}try-with-resources
try-with-resourcesを使うと、例外が発生した場合でもリーダーが自動的に閉じられます。
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader reader = new BufferedReader(new StringReader("auto-closed"))) {
System.out.println(reader.readLine());
}
}
}実際のSystem.inの例
実際にキーボードから入力する場合は、System.inをラップします。このコードをローカルで実行し、1行入力してEnterキーを押してください。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter text: ");
String input = reader.readLine();
System.out.println("You typed: " + input);
}
}ScannerとBufferedReaderの比較
便利さや数値の解析のしやすさを重視する場合はScannerを選びます。大量の入力を高速に処理する場合はBufferedReaderを選びます。ただし、その場合は解析とIOExceptionの処理を自分で行う必要があります。
確認問題
BufferedReaderに関する知識を確認しましょう。
まとめ
BufferedReaderという別の方法を学びました。
System.inをInputStreamReaderでラップし、さらにBufferedReaderでラップするreadLine()は1行全体を返し、入力の終端ではnullを返すInteger.parseIntとsplitを使って数値を自分で解析する- 検査例外である
IOExceptionをスローするため、処理するか宣言する - 大量の入力や性能が重要な入力では、Scannerよりもこちらを優先する
よくある質問
「BufferedReaderという選択肢」レッスンは無料ですか?
はい。「BufferedReaderという選択肢」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「BufferedReaderという選択肢」で何を学びますか?
コンソール入力を高速に読み取ります ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「BufferedReaderという選択肢」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Scannerで入力を読み取る
- 数値と行の読み取り
- ユーザー入力の検証
- BufferedReaderという選択肢