Java超|Javaの入出力の基本

標準入力はJavaへ情報を届ける入口、標準出力は画面へ結果を出す出口。入出力の流れをつかむと、プログラムは使う人とやり取りできるようになる。

これまでのJava学習では、画面に文字や数値を表示する方法、キーボードから文字列を受け取る方法を学んできました。

最初は、画面表示とキーボード入力は別々の処理に見えるかもしれません。

しかし、Javaの中では、大きく 入力出力 という流れで整理できます。

出力とは、プログラムから外へ情報を出すことです。

学習のはじめでは、画面に文字や数値を表示することだと考えると分かりやすいです。

これまで何度も使ってきた System.out.println は、標準出力へ文字や値を送り、画面に表示するための代表的な書き方です。

一方、入力とは、外からプログラムへ情報を受け取ることです。

キーボードから入力された文字列をJavaの中に取り込む処理が、入力にあたります。

System.in は、標準入力と結びついた入口として考えることができます。

ドラゴンボール風にたとえるなら、標準入力は 修行場の戦士から司令室へ情報が届く通信ゲート です。

標準出力は、司令室が結果や指示を表示する 大型モニター です。

戦士がキーボードから年齢や合言葉を伝える。
Javaがそれを受け取る。
必要なら文字列を数値に変換する。
最後に、結果を画面へ表示する。

この一連の流れが見えると、Javaプログラムはただ決まった文字を表示するだけではなく、使う人とやり取りしながら動くものとして理解しやすくなります。

Javaの考え方役割ドラゴンボール風のたとえ
標準入力外からプログラムへ情報を入れる戦士からの通信ゲート
System.in標準入力と結びついた入口通信が入る門
標準出力プログラムから外へ情報を出す司令室の大型モニター
System.out標準出力と結びついた通路モニターへ送る通路
println内容を表示して改行するモニターに1行表示する
変数入力された値を保存する通信内容を記録するカプセル
変換文字列を数値として読める形にする通信文を数値札へ読み替える

この記事では、Javaの標準入力と標準出力、入力された文字列を数値へ変換する流れ、入力ミスに気をつける考え方を整理していきます。

標準出力とは何か

標準出力とは、プログラムがデータを外へ出すための基本的な出力先のことです。

学習の初期段階では、標準出力は 画面 のことだと考えると分かりやすいです。

Javaで文字や数値を画面に表示するときに使ってきた System.out.println は、この標準出力へ内容を送っています。

System.out.println("修行を開始します。");

このように書くと、文字列が標準出力へ送られ、画面に表示されます。

ドラゴンボール風にたとえるなら、標準出力は司令室の大型モニターです。

Javaプログラムが伝えたい内容をモニターに表示することで、使う人がその結果を確認できます。

用語役割学習初期のイメージ
標準出力プログラムが情報を外へ出す場所画面
System.out標準出力と結びついたものモニターへ送る通路
println内容を表示して改行する処理モニターに1行表示する

ここで大切なのは、画面に表示するという操作を、Javaのしくみとして見ると 標準出力に送っている と考えられることです。

この見方ができるようになると、System.out.println を単なるお決まりの文として覚えるだけではなく、Javaが外へ情報を出すための出口として理解できます。

標準入力とは何か

標準入力とは、プログラムが外からデータを受け取るための基本的な入力元のことです。

学習の初期段階では、標準入力は キーボード のことだと考えると分かりやすいです。

キーボードから入力された文字列をJavaで受け取るときに出てきた System.in は、この標準入力と結びついています。

new InputStreamReader(System.in)

この中にある System.in は、キーボードから入ってくる情報の入口として使われます。

ドラゴンボール風にたとえるなら、標準入力は戦士からの通信が入ってくる門です。

戦士がキーボードから合言葉や数値を伝えると、その情報が標準入力を通ってプログラムの中へ入ってきます。

用語役割学習初期のイメージ
標準入力プログラムが情報を受け取る場所キーボード
System.in標準入力と結びついたもの通信が入ってくる門
readLine入力された1行を読み取る処理通信文を1行分受け取る

標準出力が 外へ出す出口 なら、標準入力は 中へ入れる入口 です。

この2つを対にして考えると、Javaの入出力の全体像がつかみやすくなります。

標準入力と標準出力の関係

標準入力と標準出力は、プログラムから見た情報の流れを表します。

標準入力は、外からプログラムへデータを入れる入口です。

標準出力は、プログラムから外へデータを出す出口です。

用語役割ふつう意味するものドラゴンボール風のイメージ
標準入力プログラムが受け取るキーボード通信が入る門
標準出力プログラムが出力する画面結果を表示する大型モニター

たとえば、キーボードで年齢を入力し、その年齢を画面に表示するプログラムは、次のような流れで動いています。

流れ内容
1標準出力で入力をうながす
2標準入力からキーボード入力を受け取る
3入力された値を変数に入れる
4必要に応じて変換する
5標準出力で結果を表示する

ドラゴンボール風にたとえるなら、まず司令室モニターが「戦士の年齢を入力せよ」と表示します。

次に、戦士がキーボードで年齢を送ります。

Javaがその通信を受け取り、必要なら数値に変換し、最後に「入力された戦士の年齢は20歳です」とモニターへ表示します。

入力と出力をこのようにひとつの流れで見ると、Javaプログラムが 受け取る → 処理する → 出す という形で動いていることが分かります。

図:標準入力と標準出力の関係

この図が示していること

この図は、Javaプログラムを中心にして、左側から標準入力で情報を受け取り、右側へ標準出力で結果を出す流れを示しています。

キーボードは標準入力、画面は標準出力として考えられます。

この図から分かることは、Javaの入出力は入口と出口の流れで整理できるということです。

System.in は入力の入口、System.out.println は出力の出口として見ると、入出力の全体像がつかみやすくなります。

キーボードから入力した内容は最初は文字列として扱われる

キーボードから入力した内容は、最初から数値として扱われるわけではありません。

ここはとても大切です。

たとえば、キーボードで 5 と入力したとします。

見た目には数値に見えます。

しかし、readLine で読み込んだ直後は、これは数値の5ではなく、文字列としての5です。

つまり、Javaはまず キーボードから入力された文字の並び として受け取ります。

入力した内容入力直後の扱い
5文字列としての5
20文字列としての20
3.14文字列としての3.14
界王拳文字列としての界王拳

ドラゴンボール風にたとえるなら、戦士が「20」と通信で送ってきても、最初は通信巻物に 20 という文字として書かれている状態です。

そのままでは、年齢や戦闘力のような数値として計算に使えるわけではありません。

Javaで本当に数値として使いたい場合は、この文字列を数値へ変換する必要があります。

数値入力では変換が必要になる

キーボードから入力された内容が最初は文字列として扱われるため、そのままでは int型や double型の変数に入れられません。

int型は整数を入れるための型です。

double型は小数を入れるための型です。

しかし、readLine で受け取った値は String型です。

そのため、型が合いません。

受け取った値そのまま数値変数に入れられるか
readLine で受け取った 20Stringそのままでは不可
整数に変換した 20intint型に入れられる
小数に変換した 3.14doubledouble型に入れられる

ドラゴンボール風に考えると、通信巻物に書かれた 20 という文字を、戦士の年齢を記録する数値カプセルにそのまま入れることはできません。

まず、「これは整数の20です」と読み替える必要があります。

Javaでは、この読み替えにあたる処理が 変換 です。

整数を入力するための基本の流れ

整数を入力して使う場合は、いきなり int型の変数に入るわけではありません。

次のような順番で処理します。

順番処理役割
1入力をうながすメッセージを表示する使う人に何を入力するか知らせる
2キーボードから1行の文字列を読み込む入力内容をString型で受け取る
3文字列を整数に変換するint型として扱える形にする
4変換した整数を変数に入れる数値として利用できるようにする
5結果を表示する標準出力へ出す

この流れで大切なのは、入力された内容をいったん文字列として受け取り、そのあとで整数へ変換しているという順番です。

ドラゴンボール風に言えば、まず戦士の通信を巻物に書き取り、その後で「これは年齢の数値だ」と判断し、年齢記録カプセルへ写す流れです。

整数入力の流れを確認する

ファイル名:Sample5.java

import java.io.*;

class Sample5
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("戦士の年齢を整数で入力してください。");

        BufferedReader br =
        new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();

        int age = Integer.parseInt(str);

        System.out.println("入力された戦士の年齢は " + age + " 歳です。");
    }
}

実行結果

戦士の年齢を整数で入力してください。
20
入力された戦士の年齢は 20 歳です。

このプログラムでは、まず画面に入力をうながすメッセージを表示しています。

System.out.println("戦士の年齢を整数で入力してください。");

これは標準出力を使って、使う人に「整数を入力してください」と伝える処理です。

次に、キーボードから入力を受け取る準備をしています。

BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));

この部分で、標準入力であるキーボードから文字列を読み取れるようにしています。

そのあと、次の文で入力された1行を受け取ります。

String str = br.readLine();

ここで入力された 20 は、まず String型の文字列として str に入ります。

そして、次の文で文字列を整数に変換します。

int age = Integer.parseInt(str);

str に入っている文字列を整数へ変換し、その結果を int型の変数 age に入れています。

最後に、変換後の age を使って画面に表示しています。

System.out.println("入力された戦士の年齢は " + age + " 歳です。");

この流れを表にすると、次のようになります。

順番処理変数の状態
1入力をうながすまだ入力はない
2br.readLine で入力を受け取るstr に文字列として 20 が入る
3Integer.parseInt で変換するage に整数として 20 が入る
4age を表示する20 が数値として使われる

ここで特に大切なのは、str と age の役割が違うことです。

変数役割
strString入力された内容を文字列として受け取る
ageint変換後の整数を入れる

str は入力された文字列を受け取る変数です。

age は、整数に変換したあとの値を入れる変数です。

この2段階を意識すると、数値入力の流れがとても分かりやすくなります。

Integer.parseIntの役割

数値入力で重要になるのが、Integer.parseInt です。

int age = Integer.parseInt(str);

この文は、str に入っている文字列を整数に変換し、その結果を int型の変数 age に代入するという意味です。

分解して見ると、次のようになります。

部分役割
str入力された文字列
Integer.parseInt(str)文字列を整数に変換する
int age = ...変換した整数を age に入れる

たとえば、str に 20 という文字列が入っている場合、Integer.parseInt(str) によって整数の 20 に変換されます。

ドラゴンボール風にたとえるなら、str は通信巻物です。

Integer.parseInt は、「この巻物の文字を整数として読み直す係」です。

age は、整数として記録する年齢カプセルです。

変換前変換処理変換後
文字列としての20Integer.parseInt(str)整数としての20

ここでのポイントは、入力された文字列をそのまま使っているのではなく、整数として使える形に変えてから利用していることです。

図:入力された文字列を整数へ変換する流れ

この図が示していること

この図は、キーボードから入力された 20 が、最初は String型の文字列として受け取られ、そのあと Integer.parseInt によって int型の整数へ変換される流れを示しています。

入力された内容は、見た目が数字でも、readLine で受け取った直後は文字列です。

この図から分かることは、標準入力から入ってきた値は、そのまま数値変数に入るわけではないということです。

String型で受け取る段階と、int型へ変換する段階を分けて考えることが大切です。

double型に変換したいとき

整数ではなく、小数を含む数値として扱いたい場合は、double型へ変換します。

そのときは、Double.parseDouble を使います。

double num = Double.parseDouble(str);

この文は、str に入っている文字列を double型の数値に変換し、その結果を num に代入するという意味です。

変換したい型書き方用途
intInteger.parseInt(str)整数として使いたい
doubleDouble.parseDouble(str)小数として使いたい

たとえば、3.14 のような小数を入力して計算に使いたい場合は、String型のままではなく、double型へ変換する必要があります。

ドラゴンボール風に考えると、整数の年齢や戦闘力として読むなら Integer.parseInt、小数を含む距離や倍率として読むなら Double.parseDouble を使うイメージです。

入力内容をどう使いたいか使う変換
整数として使いたいInteger.parseInt
小数として使いたいDouble.parseDouble
文字としてそのまま表示したい変換せずString型のまま使う

今の段階では、この対応を押さえておけば十分です。

入力された値をどう使いたいのかによって、変換方法が変わります。

入力をまちがえるとどうなるか

数値入力では、使う人が必ず正しい形式で入力してくれるとは限りません。

整数を入力してほしい場面で、小数や文字を入力してしまうことがあります。

たとえば、整数として変換したい場面で、次のような入力があると問題になります。

入力内容Integer.parseIntでの扱い
20整数として変換できる
003整数として変換できる
3.14整数としては変換できない
abc整数としては変換できない
二十整数としては変換できない

Integer.parseInt は、整数として読める文字列を前提にしています。

そのため、整数として解釈できない内容が入ってくると、うまく変換できません。

ドラゴンボール風にたとえるなら、年齢を数字で報告してほしい場面で、戦士が「若いです」と通信してきたようなものです。

意味は分かりそうでも、Javaが整数として扱うには形式が合っていません。

ユーザーの入力ミスを考えることが大切

学習のはじめでは、まず正しい入力がされる前提で、基本の流れを理解すれば大丈夫です。

ただし、実際のプログラムでは、使う人がいつも正しく入力してくれるとは限りません。

整数を求めているのに文字を入力する。
小数を求めているのに記号を入力する。
何も入力せずに Enter キーを押す。

こうしたことは、実際のプログラムではよく起こります。

入力ミスの例起こりうる問題
文字を入力する数値へ変換できない
小数を入力する整数変換では扱えない
空欄のままEnterを押す期待した値が得られない
余計な記号を入れる変換できない

本格的なプログラムでは、入力ミスがあったときにどう対応するかを考える必要があります。

たとえば、もう一度入力をうながす、エラーメッセージを表示する、処理を中止するなどの工夫があります。

今の段階では、入力にはまちがいが起こる可能性がある、と意識しておくことが大切です。

この視点を早いうちから持っておくと、後で例外処理や入力チェックを学ぶときに理解しやすくなります。

図:標準入力から標準出力までの全体像

この図が示していること

この図は、標準入力から値を受け取り、Javaプログラムの中で変数に入れ、必要に応じて変換し、標準出力へ結果を表示する流れを示しています。

キーボードは標準入力、画面は標準出力として考えられます。

この図から分かることは、Javaの入出力は、入口と出口の流れで考えると理解しやすいということです。

標準入力から受け取った値は、変数に入り、必要なら型に合わせて変換されます。

その後、System.out.println などを使って標準出力へ送られ、画面に表示されます。

標準入力と標準出力で見える入出力の流れ

標準入力と標準出力の視点で整理すると、Javaプログラムの流れがかなり見えやすくなります。

流れ内容
標準出力画面にメッセージを表示する
標準入力キーボードから文字列を受け取る
変数受け取った内容を保存する
変換必要に応じて文字列を数値に変える
標準出力結果を画面に表示する

Sample5.javaの流れも、この形にきれいに当てはまります。

処理入出力の見方
入力をうながす文を表示する標準出力
キーボードから入力する標準入力
str に文字列を入れる変数に保存
age に整数を入れる変換後の値を保存
結果を表示する標準出力

ドラゴンボール風に言えば、司令室モニターに指示を出し、戦士から報告を受け取り、報告内容を必要な形式に整え、最後に結果をモニターへ表示する流れです。

このように考えると、入力と出力は別々の知識ではなく、プログラム全体を動かす一連の流れとして理解できます。

これまで学んだ内容とのつながり

標準入力と標準出力は、新しい言葉に見えるかもしれません。

けれども、これまで学んできた内容としっかりつながっています。

これまで学んだ内容入出力とのつながり
画面表示標準出力として考えられる
キーボード入力標準入力として考えられる
変数入力された値や変換後の値を保存する
String型入力直後の文字列を受け取る
int型変換後の整数を保存する
代入読み込んだ値や変換した値を変数に入れる

画面に表示するのは標準出力です。

キーボードから受け取るのは標準入力です。

受け取った内容は変数に入ります。

必要なら型に合わせて変換します。

そして、その値をまた出力に使います。

この流れが見えるようになると、Javaの基本がばらばらの知識ではなく、ひとつのまとまりとして理解できるようになります。

Javaプログラムは、入力を受け取り、処理し、結果を出すものです。

標準入力と標準出力は、その基本の形を支えている大切な考え方です。