InputStream
標準入力(System.in
)を引数に渡して入力ストリームを生成する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package input_output; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class SystemInStream { public static void main(String[] args) { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.print(">"); try { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } } } |
実行するとプロンプト(>
)が表示されて入力待ちになり、文字列を入力してEnterを押すとその内容がオウム返しに表示される。
1 2 |
>abc abc |
Scanner
java.util.Scanner
の引数に標準入力(System.in
)を渡してインスタンスを生成し、next()
などのメソッドでキーボードからの入力を得る。
next()
以下のコードは、文字列”end”が入力されるまで、入力された文字列をオウム返しに表示し続ける。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package input_output; import java.util.Scanner; public class ScannerTest { public void scanner1() { Scanner scanner = new Scanner(System.in); for(;;) { System.out.print(">"); String line = scanner.next(); System.out.println(line); if (line.equals("end")) break; } System.out.println("Thank you."); } public static void main(String[] args) { ScannerTest app = new ScannerTest(); app.scanner1(); } } |
実行例。
1 2 3 4 5 6 7 |
>abc abc >def def >end end Thank you. |
nextInt()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package input_output; import java.util.Scanner; public class ScannerTest { public void scanner2() { int sum = 0; Scanner scanner = new Scanner(System.in); for(;;) { System.out.print(">"); int number = scanner.nextInt(); if (number <= 0) break; sum += number; } System.out.println("Sum:" + sum); } public static void main(String[] args) { ScannerTest app = new ScannerTest(); app.scanner2(); } } |
実行例。
1 2 3 4 5 |
>1 >2 >3 >-1 Sum:6 |
全角数字も扱える。
1 2 3 4 5 |
>1 >2 >3 >0 Sum:6 |
3桁ごとのカンマ区切りは通る。
1 2 3 4 |
>1,234 >2,345 >0 Sum:3579 |
仕様ではInteger正規表現にマッチし、かつ範囲内である必要がある。数値と認識されない文字列に対しては、例外が投げられる。
1 2 3 4 5 6 7 8 |
>整数 Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:939) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextInt(Scanner.java:2258) at java.base/java.util.Scanner.nextInt(Scanner.java:2212) at input_output.ScannerTest.scanner2(ScannerTest.java:22) at input_output.ScannerTest.main(ScannerTest.java:42) |
以下は数値として扱えない。
- 3桁区切りでないカンマ区切り
- 全角の漢数字
closeするとSystem.inが使えなくなる
先のコードで、new Scanner(System.in)
でインスタンスを生成している行に警告が出る(リソース・リーク: 'scanner'
が閉じられることはありません)。
そこで、Scanner
インスタンス使用後にいったんclose()
してみると、再度インスタンスを生成しようとしたときに例外が投げられる。scanner
をクローズしたときに標準入力System.in
が閉じられてしまうため。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package input_output; import java.util.Scanner; public class ScannerTest { public void scanner3() { System.out.print(">"); Scanner scanner = new Scanner(System.in); String line = scanner.next(); System.out.println(line); scanner.close(); scanner = new Scanner(System.in); line = scanner.next(); System.out.println(line); } public static void main(String[] args) { ScannerTest app = new ScannerTest(); app.scanner3(); } } |
実行結果。
1 2 3 4 5 6 7 |
>123 123 Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:937) at java.base/java.util.Scanner.next(Scanner.java:1478) at input_output.ScannerTest.scanner3(ScannerTest.java:36) at input_output.ScannerTest.main(ScannerTest.java:42) |