1年前に、標準キー入力させるのに、java.util.Scanner を使用した例を書いた。。。
oboe2uran.hatenablog.com
こんなメソッドを用意して使うのもいいが、
public static String keyIn(String guide){ System.out.print(guide); try(Scanner scan = new Scanner(System.in)){ return scan.nextLine(); } }
これを2回連続 call の実行は、
String s1 = keyIn("s1 --->"); String s2 = keyIn("s2 --->");
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
落ち着いて見直せば当然である。
System.in 標準入力を一旦 CLOSE しているのだから。
では、2回以上連続するキー入力をするには、どうするか?
次のように工夫する。
public static Map<String, String> keyIn(List<String> guides){ try(Scanner scan = new Scanner(System.in)){ return guides.stream().collect(()->new HashMap<String, String>() ,(r, t)->{ System.out.print(t + " ---> "); r.put(t, scan.nextLine()); },(r, u)->{}); } }
サンプル
キー入力要求ガイドを順に3個並べて、
結果を Map で受け取る。
Map<String, String> map = keyIn(Arrays.asList("s1", "s2", "s3")); System.out.println(map);
'a', 'b', 'c' を順にキー入力
s1 ---> a s2 ---> b s3 ---> c {s3=c, s1=a, s2=b}
となる。