コンソールへの出力は, 標準出力と標準エラー出力の2系統があります。
class Test { public static void main(String args[]) { System.out.println("標準出力です"); System.err.println("標準エラー出力です"); } }
これを通常通り java Test
として実行すると
標準出力ですと画面に出力されます。
標準エラー出力です
しかし,java Test >xxx
のようにリダイレクトすると,
標準エラー出力ですだけ画面に出力され,
標準出力ですのほうはファイル xxx に出力します。
つまり,
なお,System.out.println("何々") は出力の後で改行しますが, System.out.print("何々") は改行しません。 特別な場合として,引数なしの System.out.println() は改行だけします。
System.out.read() が, キーボードからの入力を読むための最も基本的な命令です。 これは,リターンキー(Enterキー)が押されるまでブロック (block,待つこと)します。 リターンキーが押されたら,最初に入力したキーの文字コード値を返します。
たとえば次のプログラムを考えましょう。
class Test { public static void main(String args[]) throws java.io.IOException { // 入出力エラーがありうる int c; // 変数 c を作る while ((c = System.in.read()) != -1) // キー入力を c に System.out.println(c); // c を出力 } }
ちょっとややこしい書き方がしてありますが, これは次のように書くのと同じことです。
class Test { public static void main(String args[]) throws java.io.IOException { // 入出力エラーがありうる int c; // int 型の変数 c を作る while (true) { // 以下を繰り返す: c = System.in.read(); // キー入力を c に代入 if (c == -1) break; // c が -1 ならループ脱出 System.out.println(c); // c を出力 } } }
throws java.io.IOException
については少し後で説明します。
このプログラムを実行すると,入力待ちの状態になります。 キーボードからたとえば abc リターン と入力すると, 画面には
97 98 99 10と出ます。これは,
System.in.read() は,「入力の終わり」を意味する特別な キー操作をすると,-1 という値を戻してきます。 UNIX の場合 Ctrl-D(コントロールキーを押した状態で d をたたく) で、この特別な値が返ってきます。 上のプログラムは,この値が戻ってきたらループを脱出するようにしてあります。
さて,main の最初に戻って,通常は
public static void main(String args[]) {で良かったのに,このプログラムでは
public static void main(String args[]) throws java.io.IOException {のように throws java.io.IOException を付けなければなりません。 これは,I/O(アイオー,Input/Output,入出力) でException(例外状態,要するにエラー)が起こるかもしれないことの宣言です。 データ入力を伴うプログラムでは,このような宣言が必要です。 もしこれを忘れたら,コンパイル時に次のようなエラーメッセージが出ます。
Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method.
ちなみに,java.io.IOException
のような長い名前を
書くのは面倒なので,通常はプログラムの最初に
import java.io.*;と書いておきます。そうすば,java.io の部分が省略できて,単に
public static void main(String args[]) throws IOException {と書くだけでよくなります。以下ではこの書き方をよく使います。
次のプログラムを実行すると「お名前は?」と尋ねてきますので, キーボードからたとえば 花子 と入れて リターンキーを押してください。 「こんにちは,花子さん」と答えてくれるはずです。
import java.io.*; class Test { public static void main(String args[]) throws IOException { DataInputStream d = new DataInputStream(System.in); // データ入力の準備 System.out.print("お名前は? "); // 画面出力 System.out.flush(); // 強制出力 String s = d.readLine(); // 文字列の入力 System.out.println("こんにちは," + s + "さん"); } }
ここでも import java.io.*;
が出てきましたね。
これを書かないと,
IOException は java.io.IOExceptionのように正式名を使わなければなりません。
DataInputStream は java.io.DataInputStream
キーボードから文字列を入力するには, System.in を補強するための次のような命令が必要です。
DataInputStream d = new DataInputStream(System.in);補強した System.in をここでは d と名づけています。
次の画面出力
System.out.print("お名前は? ");には,最後に改行する System.out.println(...) の代わりに, 改行しない System.out.print(...) を使いました。 ところが,Java言語の System.out では,効率化のため, 改行が来るまでデータを内部に溜めておき, 改行が来たらまとめて出力するしくみになっています。 そこで,行の途中で強制出力するために
System.out.flush(); // 強制出力が必要なのです。
文字列の入力は,さきほどの d を使って,
String s = d.readLine(); // 文字列の入力とします。
プログラムの実行が d.readLine() のところまで来ると, コンピュータは入力待ちの状態になります。 そこで例えば 花子 と打ち込み,リターンキーを押せば, s に「花子」という文字列が入ります。
次のプログラムを実行すると「あなたは何歳ですか?」と尋ねてきますので, 例えば40歳なら, キーボードから 40 と入れてリターンキーを押してください。 「きっと去年は 39 歳だったでしょう」と教えてくれるはずです。
import java.io.*; class Test { public static void main(String args[]) throws IOException { DataInputStream d = new DataInputStream(System.in); // データ入力の準備 System.out.print("あなたは何歳ですか? "); System.out.flush(); // 強制出力 String s = d.readLine(); // 文字列の入力 int a = Integer.parseInt(s); // 整数に変換 System.out.println("きっと去年は " + (a - 1) + " 歳だったでしょう"); } }
整数の入力は,まず
String s = d.readLine(); // 文字列の入力で文字列を入力してから,
int a = Integer.parseInt(s); // 整数に変換で整数に変換しています。
次のprogramは,金額を入力すると, 消費税(入力額の5%)と税込み価格を出力します。 int 型では20億円程度しか扱えませんので, long 型を使います。
import java.io.*; class Test { public static void main(String args[]) throws IOException { DataInputStream d = new DataInputStream(System.in); // データ入力の準備 System.out.print("金額? "); // 画面出力 System.out.flush(); // 強制出力 String s = d.readLine(); // 文字列の入力 long x = Long.parseLong(s); // long型に変換 long tax = 5 * x / 100; // 消費税を求める(切捨て) long total = x + tax; // 合計金額を求める System.out.println("金額: " + x + " 消費税: " + tax + " 合計: " + total); } }
10行目では入力金額を5倍して100で割って消費税を求めています。 整数の割り算ですので, 小数点以下は切捨てになります。
これを四捨五入にするには,
long tax = (5 * x + 50) / 100; // 消費税を求める(四捨五入)とします。また,切上げにするには,
long tax = (5 * x + 99) / 100; // 消費税を求める(切上げ)とします。
次のprogramを実行すると,円の半径を聞いてきます。 半径を入力すると円の面積を出力します。
import java.io.*; class Test { public static void main(String args[]) throws IOException { DataInputStream d = new DataInputStream(System.in); // データ入力の準備 System.out.print("半径? "); // 画面出力 System.out.flush(); // 強制出力 String s = d.readLine(); // 文字列の入力 double r = Double.valueOf(s).doubleValue(); // double型に変換 double a = Math.PI * r * r; // Math.PI は円周率 System.out.println("半径 " + r + " の円の面積は " + a + " です。"); } }
実行すると「半径?」と聞いてきます。 半径を例えば 5 のように打ち込むと,
半径 5 の円の面積は 78.5398 です。のように出力されます。