6日でできる 新Java入門|キーボードからの入力

外からの声を受け取れるようになると、Javaはただ動くだけの修行書から、対話できる戦いの道具へ進化する

これまでのJava学習では、プログラムの中にあらかじめ書いておいた値を使って処理を進めることが多かったと思います。けれど、実際のアプリケーションでは、それだけでは足りません。ユーザーが名前を入力したり、年齢を入力したり、選択肢を選んだりして、その内容に応じて処理が変わる場面がたくさんあります。そこで必要になるのが キーボードからの入力 です。

ドラゴンボールの世界でたとえるなら、今までは修行書に最初から書かれていた決まった手順だけを実行していた状態です。ここからは、師匠がその場で出す指示を聞き取り、その内容に応じて次の行動を決められるようになります。つまり、外から届いた情報を受け取って、プログラムが反応できるようになるわけです。

Javaでは、キーボードからの入力を受け取る方法がいくつかあります。その中でも入門段階で特に大切なのが Scannerクラス と System.in.read() です。Scannerクラスはとても扱いやすく、文字列や数値を簡単に受け取れます。一方で System.in.read() は、より低いレベルで入力の仕組みを見られる方法です。この記事では、この2つの方法を中心に、入力の流れや注意点をしっかり見ていきます。

キーボード入力とは何か

キーボード入力とは、ユーザーがキーを打って入力した文字や数値を、Javaプログラムが受け取ることです。これによって、プログラムは固定された値だけでなく、その場で与えられた情報を使って動けるようになります。

たとえば、次のような場面でキーボード入力が活躍します。

場面入力する内容
クイズアプリ解答番号
計算ツール数値
挨拶プログラム名前や年齢
選択式メニューコマンドや選択肢

ドラゴンボール風にたとえるなら、戦士が 修行名を答える、戦闘力を申告する、次に出す技を選ぶ といったやり取りを、プログラムが受け取る感覚です。

標準入力ストリームとは何か

Javaでは、キーボードからの入力は System.in を通じて受け取ります。これを 標準入力ストリーム と呼びます。

標準入力と標準出力

構成要素役割
System.in標準入力
System.out標準出力

System.out は、これまで何度も使ってきた画面への出力です。それに対して System.in は、キーボードからの入力を受け取る入口です。

ドラゴンボール風に言えば、System.out は戦士が外へ声を出す口、System.in は外からの指示を受け取る耳のようなものです。プログラムが外の世界とやり取りするには、この入口と出口の両方が必要です。

入力方法の種類

Javaでキーボード入力を扱う方法はいくつかあります。代表的なものを整理すると、次のようになります。

入力方法の比較

方法解説使いやすさ
System.in.read()1バイトずつ、または配列で直接読み取る初心者向けではない
BufferedReader + InputStreamReader1行ずつ文字列で取得する少し面倒
Scannerクラス文字列や数値を簡単に取得できる初心者におすすめ

この中で、入門では Scannerクラス が最も扱いやすいです。一方で System.in.read() は低レベルなので、内部の仕組みを理解するのに向いています。

Scannerクラスによる入力

Java入門では、Scannerクラスを使う方法が最も分かりやすく、実用的です。文字列なら nextLine()、整数なら nextInt() のように、欲しい型に応じて入力を受け取れます。

Scannerクラスの基本的な流れ

手順サンプルコード説明
1. 準備import java.util.Scanner;Scannerクラスを使えるようにする
2. 生成Scanner sc = new Scanner(System.in);Scannerを作成する
3. 入力String s = sc.nextLine();int n = sc.nextInt();文字列や整数を取得する
4. 終了sc.close();使い終わったら閉じる

Scannerクラスは、外から入ってきた情報を 扱いやすい形に整えて渡してくれる補助役 のような存在です。ドラゴンボール風にいえば、師匠の指示を正しく聞き取り、分かりやすく整理してくれる修行補助係のようなものです。

Scannerクラスを使った入力例

ここでは、名前と修行年数を入力して、メッセージを表示する例で見ていきます。

ファイル名:Lesson18_1.java

import java.util.Scanner;

public class Lesson18_1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // Scannerの作成

        System.out.print("戦士の名前を入力してください: ");
        String name = sc.nextLine();  // 1行分の文字列入力

        System.out.print("修行年数を入力してください: ");
        int years = sc.nextInt();     // 整数入力

        System.out.println("ようこそ、" + name + "さん。修行年数は " + years + " 年ですね。");

        sc.close(); // Scannerを閉じる
    }
}

実行結果

戦士の名前を入力してください: ハヤト
修行年数を入力してください: 3
ようこそ、ハヤトさん。修行年数は 3 年ですね。

このプログラムでは、まず名前を文字列として受け取り、そのあと修行年数を整数として受け取っています。入力された内容をそのまま使って、最後に挨拶文を表示しています。

Scannerでよく使うメソッド

メソッド内容
nextLine()1行の文字列入力String s = sc.nextLine();
nextInt()整数値の入力int n = sc.nextInt();
nextDouble()実数値の入力double d = sc.nextDouble();
next()次の単語まで入力String word = sc.next();

このように、Scannerクラスは 欲しい型に応じて入力方法を選べる のが大きな強みです。

Scannerクラスの良さ

Scannerクラスが初心者向けだと言われる理由は、入力されたデータをいきなり使いやすい形で受け取れるからです。System.in.read() のように、いったんバイト列で受け取って自分で変換する必要がありません。

Scannerクラスの利点

利点内容
書き方が分かりやすいコードが短く読みやすい
型ごとに入力できる文字列、整数、小数を分けて受け取れる
入門向き基本操作をすぐ試せる

つまり、Scannerクラスは キーボード入力を最初に学ぶためのいちばん扱いやすい方法 だと考えるとよいです。

System.in.read() による入力

System.in.read() は、キーボード入力をもっと低いレベルで扱う方法です。Scannerのように文字列や整数としてすぐに受け取るのではなく、まず バイト列 として読み込む形になります。

ドラゴンボール風にたとえるなら、Scanner が 師匠の指示を整理して渡してくれる補助役 だとすると、System.in.read() は 届いた気の波をそのまま受け取る方法 のようなものです。少し難しめですが、入力の流れが見えやすいです。

System.in.read() の特徴

項目内容
入力単位バイト単位
扱い方byte配列へ読み込むことが多い
利点入力の内部の仕組みを理解しやすい
注意点文字コードや改行の扱いに注意が必要

System.in.read() を使った入力例

ここでは、修行名を入力して、その内容を表示する例で見ていきます。

ファイル名:Lesson18_2.java

public class Lesson18_2 {
    public static void main(String[] args) throws Exception {
        byte[] b = new byte[100];

        System.out.print("修行名を入力してください: ");
        int len = System.in.read(b);

        String input = new String(b, 0, len).trim();

        System.out.println("入力された修行名: " + input);
    }
}

実行結果

修行名を入力してください: かめはめ波の基礎修行
入力された修行名: かめはめ波の基礎修行

このプログラムでは、キーボードからの入力を byte配列 に読み込み、それを String に変換して表示しています。

Lesson18_2.java の各行の意味

System.in.read() を使う場合は、1行ずつの役割をしっかり理解するのが大切です。

1. 入力用の配列を作る

byte[] b = new byte[100];

これは 100バイト分 の入力を入れられる配列を作っています。外から入ってきたデータは、まずここへ保存されます。

2. 入力をうながす

System.out.print("修行名を入力してください: ");

ユーザーに、何を入力すればよいのかを表示しています。

3. 入力を読み込む

int len = System.in.read(b);

ここでキーボードから入力された内容が配列 b に格納されます。戻り値 len には、何バイト読み込んだかが入ります。

4. バイト列を文字列へ変換する

String input = new String(b, 0, len).trim();

配列 b の先頭から len バイト分だけを String に変換しています。さらに trim() で前後の空白や改行を取り除いています。

5. 入力結果を表示する

System.out.println("入力された修行名: " + input);

最後に、整えた文字列を画面へ表示しています。

各行の役割を表で整理する

Lesson18_2.java の各行の役割

コード解説
1byte[] b = new byte[100];100バイト分の入力データを格納できる配列を作る
2System.out.print(...);入力をうながすメッセージを表示する
3int len = System.in.read(b);入力を配列 b に格納し、読み込んだ長さを受け取る
4String input = new String(b, 0, len).trim();配列の内容を文字列に変換し、前後の空白や改行を除去する
5System.out.println(...);入力内容を表示する

このように見ると、System.in.read() を使った入力は 読み込む、変換する、整える、表示する という流れで成り立っていることが分かります。

System.in.read() で注意したいこと

System.in.read() は便利ですが、低レベルな方法なので注意点もあります。

注意点

注意点内容
改行が含まれるEnterを押した分の改行文字も読み込まれる
trim() が必要になりやすい前後の空白や改行を除去するため
日本語入力では文字コードに注意環境によっては文字化けの可能性がある
例外が起こる可能性があるthrows Exception などの記述が必要

特に、Enter を押した分の改行が含まれるので、そのままだと余計な空白が残ったように見える場合があります。そのため trim() を使って整えることが多いです。

throws Exception が必要な理由

main メソッドの後ろにある throws Exception も、System.in.read() を使ううえで大事です。

public static void main(String[] args) throws Exception

これは、入力処理の途中で問題が起こる可能性があるため、その可能性をJavaへ伝えている形です。入門段階では 詳しくは例外処理の記事で学ぶ と考えて、ここでは こういう備えが必要なのだな と理解しておけば十分です。

Scanner と System.in.read() の使い分け

ここまでを見ると、Scanner と System.in.read() では役割が少し違うことが分かります。

使い分けの整理

方法向いている場面
Scanner入門、実用的な入力、文字列や数値を簡単に扱いたいとき
System.in.read()入力の仕組みを深く理解したいとき、低レベルな扱いを知りたいとき

つまり、普段の入門やアプリ作成では Scanner を使うのが自然です。一方で、System.in.read() を知っておくと、入力が内部でどう流れているかが見えてきます。

キーボード入力の流れを図で整理

キーボード入力は、外からの情報がプログラムの中へ入ってきて、処理に使える形へ変わる流れです。これを図にすると、かなり分かりやすくなります。

下図は、ユーザーがキーボードで入力した内容が、System.in を通ってプログラムへ入り、byte配列へ格納されたあと、String に変換されて、最後に画面表示に使われる流れを示したものです。入力された情報が そのまま使われるのではなく、途中で受け取りと変換の段階を通っていることが分かります。

↓クリックすると拡大表示されます。

この図が示していること

この図は、キーボードで入力された内容が キーボード → System.in → byte配列 → String変換 → 画面表示 という順番で処理されていることを示しています。入力の入口から、プログラム内での変換、そして利用までの流れがひとつながりになっています。

この図から分かること

この図を見ると、Javaのキーボード入力は ただ値を受け取るだけ ではなく、標準入力からデータを読み込み、それを扱いやすい文字列へ変換する段階を通っていることが分かります。System.in.read() が低レベルと言われる理由も見えやすくなります。

Scanner と System.in.read() の違いを図で整理

入力方法の違いも、図にすると直感的に見えてきます。

下図は、左側に Scannerクラス、右側に System.in.read() を配置し、それぞれがどのように入力を受け取るかを対比して示したものです。Scanner は文字列や整数としてすぐ扱える形で入力を取得し、System.in.read() はまずバイト列として受け取ってから、自分で文字列へ変換する流れになっています。

↓クリックすると拡大表示されます。

この図が示していること

この図は、Scanner と System.in.read() が同じキーボード入力を扱っていても、受け取り方と扱いやすさが違うことを示しています。Scanner は整理された形で取得し、System.in.read() は生の入力に近い形から自分で整えていく構造です。

この図から分かること

この図を見ると、初心者に Scanner がすすめられる理由と、System.in.read() が入力の仕組みを理解するのに向いている理由が整理しやすくなります。同じ入力でも、どのレベルで扱うかによって方法が変わることが分かります。

キーボード入力を理解すると、プログラムが外の世界とつながり始める

キーボード入力を理解すると、プログラムは自分の中だけで完結するものではなくなります。ユーザーから値を受け取り、その内容に応じて動き方を変えられるようになることで、クイズ、計算、メニュー選択など、実用的なプログラムの土台が作れるようになります。

ドラゴンボールの修行でも、決められた型をただ一人で繰り返すだけではなく、師匠の指示を受けてそれに応じて動けるようになると、一気に実戦的になります。Javaのキーボード入力もまさにそれと同じで、プログラムが外からの情報を受け取って反応するための大切な入口です。