BufferedReader(new InputStreamReader(System.in)) とは
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
学習したてで出会ったこの一行。
何が何やらだったので覚え書き。
この1行で何をしているか
キーボードから入力された内容を
「文字列として」「1行ずつ」安全かつ効率的に読み取れるようにする ための準備。
なぜこんなに長い書き方になるのか
Javaでは、入力処理を 役割ごとにクラスを分けて組み合わせる設計 になっているため。
この1行は、3つのクラスを重ねて使っている。
全体の構造(内側 → 外側)
System.in
↓
InputStreamReader
↓
BufferedReader
内側から順に処理を積み重ねている。
各クラスの詳しい役割
① System.in
- キーボードからの入力そのもの
- 入力形式は バイト(数値の集まり)
- 人が読む「文字」としては扱えない
例:
- キーボード入力 →
97 98 99のような数値データ
② InputStreamReader
new InputStreamReader(System.in)
- バイトデータを 文字(char)に変換 するクラス
- 文字コード(UTF-8 など)を解釈する役割を持つ
- これにより、入力を「文字」として扱えるようになる
※ まだ1文字ずつしか読めない
③ BufferedReader
new BufferedReader(...)
- 文字データを 一時的にまとめて保存(バッファリング)
- その結果、
readLine()が使えるようになる - 1行単位で入力を取得できる
BufferedReader を使う最大の理由
String line = br.readLine();
- Enter(改行)までを まとめて1行 として読む
- 入力処理がシンプルになる
- 処理速度も速い
なぜ System.in だけではダメなのか
System.in.read();
- 1文字ずつしか読めない
- 改行処理が面倒
- 数値入力には不向き
実用的ではない
発展:StringTokenizer を使う理由
BufferedReader は 1行を文字列として読むだけ なので、
次のような入力の場合、そのままでは数値を分けて扱えない。
10 20 30
この「1行に複数の値」がある場合に使うのが StringTokenizer。
StringTokenizer とは
1行の文字列を、区切り文字ごとに分解するクラス。
StringTokenizer st = new StringTokenizer(line);
これにより、1行の中の値を1つずつ取り出せる。
区切り文字を指定する場合
StringTokenizer st =
new StringTokenizer("10,20,30", ",");
- 空白区切り → 指定しなくてよい
- カンマや記号 → 指定が必要
nextToken() と hasMoreTokens()
nextToken()
- 次の要素(トークン)を1つ取得する
String token = st.nextToken();
hasMoreTokens()
- まだ取り出せる要素が残っているかを確認する
st.hasMoreTokens();
使用例
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
StringTokenizer st = new StringTokenizer(line);
while (st.hasMoreTokens()) {
int x = Integer.parseInt(st.nextToken());
System.out.println(x);
}
- 1行入力
- 空白ごとに分解
- 数値として順番に処理
BufferedReader + StringTokenizer の役割分担
| クラス | 役割 |
|---|---|
| BufferedReader | 行単位で文字列を読む |
| StringTokenizer | 行の中身を分解する |
| nextToken() | 値を1つ取得 |
| hasMoreTokens() | 残りがあるか確認 |
まとめ
-
BufferedReader:1行を高速に読む -
StringTokenizer:1行を分割する -
hasMoreTokens():残り確認 -
nextToken():値取得
キーボード入力を、
バイト → 文字 → 行 → 値
の順に変換し、扱いやすくする
Javaにおける標準的かつ高速な入力処理。
Scannerとの使い分けが必要
Scanner:簡単・遅い
BufferedReader:難しい・速い