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();