Java講座: 標準入出力
標準出力
標準出力とは、簡単に言うとプログラム内のデータをコンソール等に表示することです。
みなさんが一番はじめに実行した「Hello,world!を出力させるプログラム」がまさに標準出力を使ったプログラムの例です。
実はJavaでの標準出力の方法はみなさんすでに知っています。System.out.println()です。
括弧の中に変数や数字、文字列を入れることでコンソールにその内容を出力することができます。
「Javaプログラミングのやり方」の資料内でも少し言及しましたが、実はJavaにはSystem.out.println()以外にも標準出力を行うメソッドが用意されています。
「Hello, world!」を出力するプログラムは以下の方法でも実装することができます。
public class Main {
public static void main(String[] args) {
System.out.print("Hello, world!");
}
}実際にこのプログラムを実行してみてください。何かが変わっているはずです。
答えを言ってしまうとprintln()ではなくprint()を使うと改行がなくなります。「いらなくね?」と感じるかもしれませんが、後でこのprint()が役立つ機会があります。
標準入力
標準入力とは、簡単に言うと自分がコンソール等にキーボードで打ち込んだデータをプログラム内に取り込むことです。
多分実際にプログラムを実行してみたほうがわかりやすいと思うのでプログラム例を見せます。
import java.util.Scanner; // 必ず書く!
public class Main {
public static void main(String[] args) {
String s;
Scanner sc = new Scanner(System.in);
System.out.print("あなたの名字を入力してください: ");
s = sc.next(); // キーボードで打ち込んだ「文字列」をsに代入
System.out.println("入力された名字: " + s);
}
}プログラムを実行してみてください。キーボードで打ち込んだ名字が変数sに取り込まれて、最後に表示されるはずです。 このプログラムを見た皆さんが思うことはわかります。「Scannerってなんやねん」ですよね。解説します。
まず、Scanner sc = new Scanner(System.in)についてです。
簡単に言うと、ScannerはintやStringといったような「型」の一種です。int xと書くと「xをintという型の変数として宣言する」という意味になるように、「scをScannerという型の変数として宣言する」という意味になります。
標準入力を行う際にはプログラム例のようにnew Scanner(System.in)と書くことで初期化することができます。これは(今のとこは)おまじないです。
これによって、scがScanner型の変数として入力を行うようになります。 具体的には、scが入力を行うための色々な機能(メソッド)を持つようになります。その中の一つが、今回利用しているnext()`というメソッドです。このメソッドを使用することにより、入力された文字列をプログラム内のデータとして取り込むことができます。
今私が文字列という言葉を強調したように、このnext()メソッドでは文字列しか受け取ることができません。しかし、ちゃんと他の型を受け取るメソッドも用意されています。
例えば、int型の場合にはnextInt()、double型の場合にはnextDouble()というメソッドを使うことで入力を受け取ることができます。
話は変わりますが、今回のプログラム例の8行目でprint()メソッドを使用していることに気がついたでしょうか?このように、改行しないほうが見やすい場合にprint()メソッドは役立ちますね。
余談
new Scanner()について
簡単のため、先ほどScannerのことを「型」だと説明しましたが、厳密には「クラス」というものです。
実は前回資料の余談で紹介したIntegerやDouble、さらにはStringも厳密には「クラス」です。(intやdoubleは型です)
気になる人は「Java クラス」や「Java インスタンス化」などで検索してみてください。検索結果の内容が分かる頃、new Scanner(System.in)という呪文が一体何をしているのか分かるようになるはずです。
改行文字
print()メソッドを紹介した際、「じゃあ改行はprintln()メソッドを使うことでしかできないの?」と思った人もいるかも知れません。実は、人力で無理やり改行する方法があります。以下にその方法を使ったプログラム例を添付します。
public class Main{
public static void main(String[] args) {
System.out.print("Hello, world!\n");
}
}\nという謎の文字が最後にくっついていますね。これを改行文字といい、これを入れることで無理やり改行することができます。実際に\nが文字列として出力されることはありません。
C言語やC++などではよく使うかもしれません。頭に入れておくと案外役立つかも?
発展編
注意!ここから解説する内容は発展的な内容を含んでいます。今は「そんなものがあるんだなあ」くらいの理解で十分ですのであまり深く考えすぎないように。
テキストファイルからの入力
Javaはコンソールからだけでなく、テキストファイルに書かれている内容も入力として受け取ることができます。実際にやってみましょう。Main.javaがあるフォルダにinput.txtという名前のファイルを新しく作成してください。
その後、input.txtに以下のように書きます。
1
2
3
4
5
6
7
8
9一つ数字を書くごとに改行してください。
そうしたら、Main.javaに以下のようなコードを書いてください。
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
int sum = 0;
try (BufferedReader br = Files.newBufferedReader(Paths.get("./input.txt"))) {
String line = "";
// ファイルの最後の行になるまで、各行を読み込む
while ((line = br.readLine()) != null) {
int lineInt = Integer.parseInt(line); // lineは文字列のため、int型に変換する
sum += lineInt;
}
System.out.println(sum);
} catch (IOException e) {
e.printStackTrace();
}
}
}このコードは、input.txtに書かれている数の和を計算して出力するものです。うまく実行できていれば、1~9までの数字の和、すなわち45がコンソールに出力されるはずです。
肝心のinput.txtを読み込む処理は10行目のtry (BufferedReader br = ...)のところで書かれています。今完全に理解する必要はありません。「こうやって書けばファイルが読み込めるんだなあ」くらいに考えておいてください。(ぶっちゃけ調べればいくらでも出てくる)
テキストファイルへの出力
あまり使いませんが、せっかくだし解説します。
入力のときにはBufferedReaderという型(厳密にはクラス)を使用しました。出力のときにはBufferedWriterを使用します。
読み込むからReader、書き込むからWriterと覚えましょう。
Main.javaを以下のように書き換えてください。
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class Main {
public static void main(String[] args) {
String s = "Hello, world!";
try (BufferedWriter bw = Files.newBufferedWriter(Paths.get("./output.txt"), StandardOpenOption.CREATE)) {
bw.write(s);
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}これはoutput.txtというファイルを作成し、「Hello, world!」という文字列を書き込むプログラムです。StandardOpenOption.CREATEは、「もしoutput.txtというファイルがなかったら、新しく作成する」というオプションです。
入力のときと同様、「こうすればファイルに書き込めるんだなあ」程度の理解で十分です。