BufferedReaderを使う理由
バッファリングありとなしの読み取りを比較します。
「BufferedReaderを使う理由」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
Javaで入力を読み取る
実際のプログラムの多くは、ユーザーからの入力を必要とします。名前、数値、コマンドなどです。Javaには入力を読み取る方法がいくつかありますが、最も一般的で効率的な方法の1つがBufferedReaderです。
このレッスンでは、BufferedReaderがなぜ存在するのか、そしていつ使うべきかを学びます。
入力元
コンソールに入力すると、テキストはSystem.inを通って入ってきます。これは低レベルのバイトストリームであり、扱いやすいテキストではなく生のバイトを提供します。
そのバイトを読み取り可能な文字や行全体に変換するには、System.inをヘルパークラスでラップします。BufferedReaderは、この処理を簡単にするラッパーです。
バッファ付きとは
キーボードやファイルから1バイトずつ読み取るのは低速です。バッファとは、一度に多くの文字を保持するメモリ領域です。
BufferedReaderはこのバッファをまとめて読み込み、その後データをすばやく渡します。基盤となるストリームへのアクセス回数が減るため、特に入力が大きい場合にパフォーマンスが向上します。
2層構成
BufferedReaderはSystem.inを直接読み取れません。これは、そのストリームがバイトを提供するためです。まずInputStreamReaderでラップし、バイトを文字に変換します。
System.in→ バイトInputStreamReader→ 文字BufferedReader→ バッファリングされた行
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);定番の1行コード
コンソール入力を読み取るほぼすべてのJavaプログラムで、この正確な行を目にすることになります。2つのラッパーを1つの文で連結しています。
覚えておきましょう。内側のInputStreamReaderはバイトから文字への変換を担当し、外側のBufferedReaderはバッファリングと便利なreadLine()メソッドを追加します。
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));必要なインポート
これらのクラスはjava.ioパッケージに含まれているため、ファイルの先頭でインポートする必要があります。
入力の読み取りは失敗する可能性があるため、メソッドはIOExceptionをスローします。これもインポートするか処理する必要がありますが、詳しくは後で説明します。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;BufferedReaderとScannerの比較
初心者はまずScannerを使うことがよくあります。Scannerは数値を直接パースできて扱いやすい一方、低速です。
- Scanner:パースは簡単ですが、オーバーヘッドが大きくなります。
- BufferedReader:高速で行全体を読み取れますが、数値は自分でパースする必要があります。
大きな入力や競技プログラミングでは、速度の面でBufferedReaderが優れています。
行全体を読み取る
中心となるメソッドはreadLine()です。ユーザーが入力してEnterを押すまでのすべてを読み取り、改行なしのStringとして返します。
入力がもう存在しない場合、readLine()はnullを返します。これについては次のレッスンで詳しく説明します。
String name = br.readLine();
System.out.println("Hello, " + name);完全な読み取りプログラム
完全なプログラムを見てみましょう。1行を読み取り、ユーザーに挨拶します。mainにthrows IOExceptionが付いている点に注目してください。これは、学習中に入力エラーを上位へ伝播させる簡単な方法です。
このスニペットはキーボード入力を待つため、ここでは自動実行できませんが、正しいJavaコードです。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
System.out.println("Hi " + name);
}
}入力なしで動作を確認する
ラッパーが存在し、コンパイルできることを確認するため、何も読み取らず、オブジェクトが作成されたことだけを確認する実行可能なバージョンを示します。
実際のアプリではreadLine()を呼び出しますが、このバージョンではメッセージを表示するため、今すぐ実行できます。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("BufferedReader is ready!");
}
}BufferedReaderを使う場面
次のような場合はBufferedReaderを使います:
- 多数の行や大きなファイルを読み取る場合
- 速度を重視する場合
- 単純に行単位でテキストを扱いたい場合
数値をすばやくパースしたく、入力が小さい場合は、代わりにScannerを使います。どちらも有効な方法です。適切なツールを選びましょう。
確認問題
BufferedReaderの構成について理解度を確認します。
まとめ
System.inはバイトストリームであり、InputStreamReader(バイトから文字への変換)、続いてBufferedReader(バッファリングとreadLine())でラップされることを学びました。
バッファリングによってパフォーマンスが向上し、BufferedReaderは大きな入力や行単位の入力で力を発揮します。次は、行の読み取りについて詳しく学びます。
よくある質問
「BufferedReaderを使う理由」レッスンは無料ですか?
はい。「BufferedReaderを使う理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「BufferedReaderを使う理由」で何を学びますか?
バッファリングありとなしの読み取りを比較します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「BufferedReaderを使う理由」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- BufferedReaderを使う理由
- 行の読み取り
- 入力から数値を解析する
- ストリームを安全に閉じる