検索

キーワード


【Java】標準入出力とは?書式指定のやり方は?Scannerクラスとは? 使い方を解説!

  • 公開日:2020-09-18 09:04:59
  • 最終更新日:2021-01-25 17:48:52
【Java】標準入出力とは?書式指定のやり方は?Scannerクラスとは? 使い方を解説!

こんにちは。

駆け出しプログラマーの松倉です!

ここでは、標準入出力とScannerクラスついて紹介・解説します。

プログラミング未経験の方、Javaについて勉強している方、これから勉強したいと思っている方の参考になれば幸いです! 


関連記事リンク: 【Java】 メソッドの役割や型との関係、オーバーロードの使い方【Java】例外クラスの概要や使用実例を解説【Java】例外クラスの制御方法 3種類の基本と使い方を解説


標準入出力

標準入出力とは Systemクラスを使ってキーボードから入力をしたり、コンソールに結果を出力することです。

コンピュータシステムのハードウェアは、制御装置、演算装置、記憶装置、入力装置、出力装置といった 5つの基本要素から構成されています。

この内、よく使用する標準的な入力装置、出力装置については簡単に扱えるような仕組みがOSにより提供されています。

Javaではデータの入出力を行うには、ストリームを利用するのが一般的です。

ストリームとはデータを受け渡しするための手続きを抽象化したものです。

Javaでは Systemクラスに「in、out、err」という 3つの staticフィールドが用意されており、それぞれ標準入力標準出力標準エラー出力に対応しています


この記事では標準入出力について以下のことを紹介・解説を行います。

  • 標準入力(System.in)
  • 標準出力(System.out)
  • 標準エラー出力(System.err)
  • 書式設定(printfメソッド)
  • Scannerクラス(キーボード入力)
  • Scannerクラス(ファイル入力)


標準入力(System.in)

標準入力とはキーボードで文字列などを入力することです。

主にコンソールでキーボードから入力した内容を、プログラムがデータとして受け取って処理を実行します。

標準入力のストリームは「System.in」です。 

「System.in」は InputStreamクラスのオブジェクトです。


Javaドキュメントでは以下のように定義されています。

public static final InputStream in

Scannerクラスや InputStreamReaderクラスのオブジェクトに変換して文字列で取得できるようにします。

InputStreamReaderクラスを使っても入力文字列を取得することができますが、このクラスには一文字ごとに読み込む「readメソッド」しか用意されていません。

BufferedReaderクラスのオブジェクトに変換して一行まとめて読み込む方法が一般的です。


BufferedReaderクラスの readLineメソッドを使ったサンプルコードを確認しましょう。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Sample1 {
	public static void main(String[] args) throws IOException {
		System.out.println("入力してください");
		BufferedReader reader = null;

		try {
			reader = new BufferedReader(new InputStreamReader(System.in));
			String str = reader.readLine();
			System.out.println(str);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null)
				reader.close();
		}
	}
}

プログラムを実行するとコンソールが入力待機の状態になります。

"Hello"とテキストを直接入力してリターンキーを押しましょう。


実行結果:

入力してください
Hello
Hello

コンソールに入力されたテキストが読み込まれ、コンソールに出力されたことが確認出来ました。



標準出力(System.out)

標準出力とはプログラムから文字列などのデータを表示し、ディスプレイへ出力することです。

標準出力のストリームは「System.out」です。 


「System.out」は PrintStreamクラスのオブジェクトで Javaドキュメントでは以下のように定義されています。

public static final PrintStream out

PrintStreamクラスでは以下のメソッドが用意されています。

  • printlnメソッド:引数のデータを出力し、出力後に改行する。
  • printメソッド:引数のデータを出力し、出力後に改行しない。
  • printfメソッド:書式付き文字列を指定された書式文字列と引数を使用し、出力ストリームに書き込みます。

※printfメソッドについては書式指定(printfメソッド)で後述します。


標準出力をサンプルコードで確認しましょう。

public class Sample2 {
	public static void main(String[] args) {

		System.out.print("Hello");
		System.out.println("Hello");
	}
}


実行結果:

HelloHello

「printメソッド」と「printlnメソッド」はどちらも引数のデータを出力していますが、出力結果で改行するかしないかの違いがあります。



標準エラー出力(System.err)

標準エラー出力とはエラーメッセージをディスプレイへ出力することです。

標準エラー出力のストリームは「System.err」です。 

特に指定がなければ標準エラー出力は画面上に出力されます。 


「System.err」は PrintStreamクラスのオブジェクトで Javaドキュメントでは以下のように定義されています。

public static final PrintStream err

「System.err」は「System.out」と同じ PrintStreamクラスのオブジェクトです。


これら 2つはどちらも出力されディスプレイの画面に表示される点では同じですが、出力先に違いがあります。

結果を出力するだけの場合は標準出力だけあればよいのですが、エラーが発生した場合にもそれをどこかへと出力する必要があります。

出力とエラー出力の結果を分けることができないと困るため、標準エラー出力というものが標準出力とは別に用意されています。


標準エラー出力をサンプルコードで確認しましょう。

public class Sample3 {
	public static void main(String args[]) {
		System.err.println("エラーです");
	}
} 


実行結果:

エラーです 

標準エラー出力がコンソール画面に表示されたことが確認出来ました。



書式指定(printfメソッド)

Javaには PrintStreamクラスのprintfメソッド」があります。

このメソッドは文字列や数値などを指定した書式で画面に出力することができます。

コンソールに出力される変数をカンマ区切りで整形し、単位を加えて画面に出力するときなどに使用します。


printfメソッドの使い方

System.out.printf(書式, 引数1, 引数2, 引数3)

printfメソッドは引数1に出力したい書式を、引数2以降に使用する変数を記入します。

引数2以降は必要なだけ引数を指定することができます。

※引数すべての基本データ型、String型、参照型を入れることができます。


printfメソッドで出力する変数を編集する場合、書式に書式指定子という記号を使用します。

書式指定子は編集したい内容によって型、桁数、改行、引数番号、日付などを指定するための書式指定子が用意されています。

            型を指定する書式指定子

          桁数や改行に関する書式指定子

          日付に関する書式指定子

単純な変数の出力の場合 printメソッド、書式の指定をする場合は printfメソッドを使用しましょう。


printfメソッドを使った書式指定をサンプルコードで確認しましょう。

public class Sample4 {
	public static void main(String[] args) {
		String str = "円";
		int num1 = 100;
		int num2 = 100000;
		System.out.println("---型指定---");
		System.out.printf("%d%s%n", num1, str);

		System.out.println("---桁合わせ---");
		System.out.printf("金額は%,6d%sです。%n", num1, str);
		System.out.printf("金額は%,6d%sです。%n", num2, str);
	}
}


実行結果:

---型指定---
100---桁合わせ---
金額は   100円です。
金額は100,000円です。

型指定では ”100円” と出力されたのが確認できました。

引数1の書式指定子は「%d」で引数2の変数 num1を整数に指定、「%s」で引数 3の変数 strを文字列に指定、「%n」で改行を指定しています。


桁合わせでは "金額は "100円です。" 、 "金額は100,000円です。" と出力されたのが確認できました。

引数1の書式指定子は「%,6d」で引数2の変数 num1、num2をカンマを含む 6桁の整数に指定、「%s」で引数3の変数 strを文字列に指定、「%n」で改行を指定しています。

num2は変数が保持している数値が 6桁のため、コンマが挿入された数値が出力されます。

方で num1は数値が  3桁のため、指定された6桁になるように数値の前に空白が挿入され桁合わせが行われています。



Scannerクラス(キーボード入力)

Scannerクラスは標準入力を指定した場合、キーボードから入力されたテキストを読み込みます

キーボードからの入力を受けつける場合は「System.in」を使って記述します。


Scannerクラスの使い方

Scanner scan = new Scanner(System.in);

プログラムを実行するとコンソールにテキストが入力できるようになります。

コンソールでリターンキーを押すと入力が完了したと見なされます。

Scannerクラスには以下のメソッドが用意されています。

  • nextLineメソッド:一行分の入力を取得する
  • nextメソッド:空白文字までの入力を取得。
  • nextIntメソッド:数値の入力を取得する

入力するテキストが文字列の場合と数値の場合で使用するメソッドが違うので覚えておきましょう。

Scannerクラスは if文のような条件分岐を組み合わせて使用することで、テキスト入力の有無によって実行結果が変化するプログラムを書くことができます。


Scannerクラスを使ったサンプルコードを確認しましょう。

import java.util.InputMismatchException;
import java.util.Scanner;

public class Sample5 {
	public static void main(String[] args) {
		System.out.println("入力して下さい");

		Scanner scan = new Scanner(System.in);
		try {
			String str = scan.nextLine();

			if (str.isEmpty()) {
				System.out.println("空です");
			} else {
				System.out.println("入力されました : " + str);
			}

		} catch (InputMismatchException e) {
			System.out.println("例外が発生しました");
		} finally {
			scan.close();
		}
	}
}


プログラムを実行するとコンソールが入力待機の状態になります。

入力して下さい

"abc" とテキストを直接入力してリターンキーを押しましょう。


実行結果:

入力して下さい
abc
入力されました : abc

"abc" とテキストが入力されたため、条件分岐で「入力されました」という結果が確認できました。


Scannerクラス(ファイル入力)

Scannerクラスはテキストだけでなくファイルの中身を読み込むこともできます

Scannerクラスはキーボードから入力された値を読み取っていましたが、ファイル入力では代わりにファイルを指定します。

指定されたファイルに書かれているプログラムなどの内容を読み込むことができます。

Scannerクラスが多く使われる場面がこのファイルからの読み取りです。

ファイルに書かれている文だけを読み込む処理を行う場合には Scannerクラスで用意されている「hasnextメソッド」を使います。

このメソッドは「nextメソッド」で読み込めるデータが残っているのかどうかを判別します。


Scannerクラスを使ったファイルの読み込みを行う場合ファイルが存在しない場合のために例外処理を書く必要があります。

書いていない場合コンパイルエラーになるので注意しましょう

Scannerクラスを使ったファイルの読み込みをサンプルコードを確認しましょう。

"targetfile.txt"というテキストファイルを別途で用意し、サンプルプログラムと同じディレクトリに置きます。


"targetfile.txt"

あいうえお
かきくけこ
さしすせそ


以下のコードを実行します。

public class Sample6 {
	public static void main(String args[]) {
		Scanner scan = null;
		try {
			scan = new Scanner(new File("targetfile.txt"));
			System.out.println("ファイルを読み込みました。");
			while (scan.hasNext()) {
				String str = scan.next();
				System.out.println(str);
			}
			System.out.println("ファイルの中身を出力しました。");
		} catch (FileNotFoundException e) {
			System.out.println("ファイルが存在しませんでした。");
		} finally {
			if (scan != null)
				scan.close();
		}
	}
}


実行結果:

ファイルを読み込みました。
あいうえお
かきくけこ
さしすせそ
ファイルの中身を出力しました。

"targetfile.txt"ファイルを指定することで中のテキストを読み込むことが確認できました。


※補足

Javaでは「System.in」からキーボード入力を受け付ける方法が「BufferedReaderクラス」と「Scannerクラス」の 2つがあります。

これら 2つには違いがあります。

BufferedReaderクラスは文字列しか受け取れません。

数値を扱いたい場合、文字列を受け取ったあとに数値に変換しなければなりません。

また BufferedReaderクラスの readLine()メソッドを実行する場合、IOExceptionが発生する可能性があります。

そのため try-catch文などの例外チェックの対処が必要です。

BufferedReaderクラスは Scannerクラスより処理速度が速く、パフォーマンスに優れています。

処理速度を重視する場合は BufferedReaderクラスを使いましょう。


一方で Scannerクラスは nextInt()メソッドを使うことで数値を直接受け取れることができます。

また Scannerクラスでは例外チェックの対処は不要です。

例外チェックがなくなる分、BufferedReaderクラスを使用した場合よりも Scannerクラスを利用した方がコードは簡潔にすることができます。

簡潔なコードを書く場合は Scannerクラスを使いましょう。


まとめ

今回の記事では標準入出力と Scannerクラスについて説明しました。

Javaでは標準入力を行う場合、「Scannerクラス」や「InputStreamReaderクラス」を使って文字列に変換してから入力を取得する必要があります。

標準出力を行う場合、「printfメソッド」を使うことで文字列などの値を指定した書式で画面に表示することができます。

printfメソッドはプログラムのデバッグで変数を出力したり、実行結果を見やすいように整形する場面で便利なので、ぜひ活用してください。

Scannerクラスではキーボードから入力する方法を解説しました。

キーボードから入力した文字をプログラムで使用できるのでぜひ活用してください。

特にファイルの読み込みはプログラムを書く上で活躍場面が多いため、ぜひ使い方を覚えましょう!


関連記事リンク: 【Java】 メソッドの役割や型との関係、オーバーロードの使い方【Java】例外クラスの概要や使用実例を解説【Java】例外クラスの制御方法 3種類の基本と使い方を解説

【著者】

松倉祥大

はじめまして。フォワードソフト株式会社の松倉です。
システムエンジニアとして働き始めたのが2020年4月です。経験や知識がない状態で入社した私は、フォワードソフトの教育研修で一からプログラミングの勉強をしました。教育研修を卒業後、Javaのプログラミングについて初学者向けの記事を共同で制作しています。
知識や経験はまだまだですが、これからいろんな職場で様々な経験しながら勉強していきたいと思っています。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様