今回はユーザーから入力される文字列を取得する処理を作ります。入力する元は標準入力つまりターミナルからの入力とします。標準入力はSystem.inを指定します。ただこれはバイト入力なのであまり使い勝手がよくありません。Enterキーで入力された文字列を取得するには入力されたバイトデータを文字データに変換してEnterキーを判定しなくてはいけないからです。このためこのInputStreamクラスを別なクラスでラップします。ラップ wrapとは「包み込む」という意味です。ちょうど水道管のままだと使いにくいので水道管の端に蛇口をつけるような感覚です。
今回利用するクラスについて
入力を扱うクラスにはInputStreamクラスとReaderクラスがあります。どちらも入力を扱うのですが前者はバイトデータの流れつまりバイトストリームを、後者は文字のストリームを扱います。System.inはInputStreamなので文字を扱えるReaderクラスとして扱いと思います。そのときに使うのがInputStreamReaderクラスです。これはReaderのサブクラスですが流入元にInputReaderクラスを使うことができます。以下のようにインスタンスを作ります。
InputStreamReader isReader = new InputStreamReader(System.in);
Readerクラスは流入する文字を順々に取得できることはできますがその文字のどこがEnterキーつまり改行コードなのかは自分で調べる必要があります。そこで流入する文字をあらかじめバッファしてEnterキーが検出された時にそれまでのバッファ文字を文字列にして返すクラスがあります。それがBufferedReaderクラスです。BufferedReaderクラスはReaderクラスを流入元に使います。もちろんそのサブクラスであるInputStreamReaderも使えます。
BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in));
このように二段階でラップします。
利用するにはクラス利用の宣言をする必要があります。ソースファイルの一番上にimport文を以下のように指定します。
import java.io.InputStreamReader; import java.io.BufferedReader;
このあたりはIDE 統合開発環境であれば自動でこういった文を入れてくれるので面倒に感じる方はIDEの導入を検討してください。
クラスを使うにはAPIのドキュメントを参照すると良いです。Java8のドキュメントは以下になります。コアコードで提供されているクラスはよく使うと思うので場所を覚えておくようにしてください。
英語版:https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html
日本語版:http://docs.oracle.com/javase/jp/8/docs/api/java/io/BufferedReader.html
さてこのBufferedReaderから文字列を取得するにはreadLineメソッドを呼び出します。このメソッドが呼ばれると実行しているプログラム(Javaでは実行スレッドと呼びます)は入力待ちになります。ユーザが標準入力から入力しEnterキーを押すまでひたすら待つことになります。
文字入力が完了した時点で入力文字列を返してくれます。
ではサンプルコードを書いてみましょう。
import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.IOException; public class Test{ public static void main(String[] args) throws IOException { BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in)); String str = bufReader.readLine(); System.out.println("読み込んだ文字列は" + str + "です。"); } }
mainメソッドにthrows IOExceptionという宣言があります。これはreadLineメソッドが同じ宣言をしているために付けてあります。意味は「このmainメソッドではIOExceptionという例外が投げられる可能性があるのでこのメソッドを呼び出す側では何かしら対処してください」となります。IOExceptionは入出力に関する例外の情報を持ちます。readLineメソッドは入力された情報を取得するためのメソッドなので入力時になにか正常に取得できないような問題が起こる可能性があります。
通常そこで処理を中断してよければ自分の実装しているメソッドにも同じようにthrows宣言をかけばいいです。
さてこれを実行してみましょう。
$ javac Test.java $ java Test Hello 読み込んだ文字列はHelloです。
続きます。