0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BufferedReaderを用いた標準入力について

0
Last updated at Posted at 2026-01-26

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:難しい・速い

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?