Java 扫描仪标准
Java Scanner Standard in
我正在使用 Eclipse 作为我的 IDE。我正在阅读一个简单的文件:
1 Andrew
2 Peter
3 Andrew
3 Peter
3 Andrew
我的问题是 Andrew 最后一行的 sc.next() 挂起并且永远不会完成。有没有办法让它在最后一行接受安德鲁然后退出 while 循环?我相信标准正在等待更多的输入,而不是仅仅抓住安德鲁并说我已经得到我需要的东西并继续前进。
这是我遇到问题的部分代码
sc = new Scanner(System.in);
while(sc.hasNextLine()){
String number = sc.next();
String name = sc.next();
int numberI = Integer.parseInt(number);
Usage usage = new Usage(name);
computerNames[numberI].addObsseration(usage);
}
sc.close();
在此先感谢您的帮助。
您的扫描仪正在从 (System.in
) 中的标准读取,而不是从您的文件 (/YourComputerPath/.../filename
) 中读取。您需要更改扫描仪的实例化。
sc = new Scanner(new File("/PathToMyFile/.../myfile"));
不是一个大 IO 人,但根据我在学校的记忆(使用 C,而不是 Java),我们经常会在文件末尾添加一个转义符(在你的例子中,最后一个行可能是“0 EOF”),然后当数字 == 0 和 name.equals("EOF")时,你知道要跳出循环。
编辑:Jakob 似乎有适当的理由来回答为什么会发生这种情况。
问题
您正在使用 hasNextLine()
和 next()
。当您使用 next()
抓取数据时,您应该使用 hasNext()
。此外,您应该知道可以通过使用 sc.nextInt()
而不是 sc.next()
将整数的解析合并到同一步骤中来获取整数。
为什么会这样?
sc.nextLine()
吞噬一切直到下一个换行符。 sc.next()
采用下一个以空格分隔的标记。 nextLine()
即使我们已经捕获了所有令牌,也可能有另一个可用的换行符。
如果您不是从文件中读取而是在命令行中键入数据,则可能需要在键入输入后按 Control+D 以模拟文件末尾。
您正在读取输入,而不是从文件中读取,而是从标准输入中读取。因此,除非您将标准输入流关闭到 运行 java 进程中,否则 Scanner
总是认为有更多可用的输入。
如果您确实设法关闭了标准输入流,如果尾随换行符,您的代码也会失败。您应该使用 hasNext()
而不是 hasNextLine()
来解决这个问题。
如果您想从流中读取数据,我建议您在 InputStreamReader
上使用 BufferedReader
以及 readLine()
和 split()
。这不仅可以解决你的问题,还可以让输入更快。
通常最好先读取一个文件,然后再解析它(而不是同时解析)。一个例子是这样的:
sc=new Scanner(System.in);
String input="";
while((input=sc.nextLine())!=null) {
String[] arr=input.split(" ");
int numberI=Integer.parseInt(arr[0]);
Usage usage=new Usage(arr[1]);
computerNames[numberI].addObsseration(usage);
}
sc.close();
我正在使用 Eclipse 作为我的 IDE。我正在阅读一个简单的文件:
1 Andrew
2 Peter
3 Andrew
3 Peter
3 Andrew
我的问题是 Andrew 最后一行的 sc.next() 挂起并且永远不会完成。有没有办法让它在最后一行接受安德鲁然后退出 while 循环?我相信标准正在等待更多的输入,而不是仅仅抓住安德鲁并说我已经得到我需要的东西并继续前进。
这是我遇到问题的部分代码
sc = new Scanner(System.in);
while(sc.hasNextLine()){
String number = sc.next();
String name = sc.next();
int numberI = Integer.parseInt(number);
Usage usage = new Usage(name);
computerNames[numberI].addObsseration(usage);
}
sc.close();
在此先感谢您的帮助。
您的扫描仪正在从 (System.in
) 中的标准读取,而不是从您的文件 (/YourComputerPath/.../filename
) 中读取。您需要更改扫描仪的实例化。
sc = new Scanner(new File("/PathToMyFile/.../myfile"));
不是一个大 IO 人,但根据我在学校的记忆(使用 C,而不是 Java),我们经常会在文件末尾添加一个转义符(在你的例子中,最后一个行可能是“0 EOF”),然后当数字 == 0 和 name.equals("EOF")时,你知道要跳出循环。
编辑:Jakob 似乎有适当的理由来回答为什么会发生这种情况。
问题
您正在使用 hasNextLine()
和 next()
。当您使用 next()
抓取数据时,您应该使用 hasNext()
。此外,您应该知道可以通过使用 sc.nextInt()
而不是 sc.next()
将整数的解析合并到同一步骤中来获取整数。
为什么会这样?
sc.nextLine()
吞噬一切直到下一个换行符。 sc.next()
采用下一个以空格分隔的标记。 nextLine()
即使我们已经捕获了所有令牌,也可能有另一个可用的换行符。
如果您不是从文件中读取而是在命令行中键入数据,则可能需要在键入输入后按 Control+D 以模拟文件末尾。
您正在读取输入,而不是从文件中读取,而是从标准输入中读取。因此,除非您将标准输入流关闭到 运行 java 进程中,否则 Scanner
总是认为有更多可用的输入。
如果您确实设法关闭了标准输入流,如果尾随换行符,您的代码也会失败。您应该使用 hasNext()
而不是 hasNextLine()
来解决这个问题。
如果您想从流中读取数据,我建议您在 InputStreamReader
上使用 BufferedReader
以及 readLine()
和 split()
。这不仅可以解决你的问题,还可以让输入更快。
通常最好先读取一个文件,然后再解析它(而不是同时解析)。一个例子是这样的:
sc=new Scanner(System.in);
String input="";
while((input=sc.nextLine())!=null) {
String[] arr=input.split(" ");
int numberI=Integer.parseInt(arr[0]);
Usage usage=new Usage(arr[1]);
computerNames[numberI].addObsseration(usage);
}
sc.close();