回答編集履歴

1

説明の追加

2021/07/11 12:35

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -47,3 +47,67 @@
47
47
  ところが、入力をファイルに切り替えると、そのような表示もされません。
48
48
 
49
49
  それは、Scanner の使い方を間違っているからです。
50
+
51
+
52
+
53
+ **追記**
54
+
55
+ 一つの入力である System.in に対して、ループの中で
56
+
57
+ Scanner を何度も new するのはよくありません。
58
+
59
+ Scanner を new すると、生成された Scannerオブジェクトは
60
+
61
+ それぞれが 8KB 程度のバッファを保持します。
62
+
63
+ 標準入力の System.in がキーボードなら、入力は行単位なので、
64
+
65
+ 各Scannerオブジェクトのバッファに 1行ずつ入るだけで、
66
+
67
+ 思い通りの処理がされますが、
68
+
69
+ javac Keisan <data.txt
70
+
71
+ のように標準入力をファイルに切り替えると、最初の Scannerオブジェクトが
72
+
73
+ 自分の持っているバッファ一杯にファイルの内容を読み込んでしまいます。
74
+
75
+ nextLine で 1行取得しますが、残りの 4行はバッファ内に残ります。
76
+
77
+ 2番目の Scannerオブジェクトが続きを読もうと思っても、
78
+
79
+ もうファイルの終わりに達しているので読み込めません。
80
+
81
+
82
+
83
+ ということで、次のように Scanner の new は 1回だけにしましょう。
84
+
85
+ ```Java
86
+
87
+ import java.util.Scanner;
88
+
89
+
90
+
91
+ public class Keisan {
92
+
93
+ public static void main(String[] args) {
94
+
95
+ Scanner sc = new Scanner(System.in);
96
+
97
+ String name = "";
98
+
99
+ for(int i = 0; i < 5; i++)
100
+
101
+ name += sc.nextLine();
102
+
103
+ System.out.println(name + "です。");
104
+
105
+ }
106
+
107
+ }
108
+
109
+ ```
110
+
111
+ もちろん、入力が複数のファイルだとか、複数の文字列で、それに対して
112
+
113
+ Scannerオブジェクトを複数生成するのは構いません。