【问题标题】:Java Scanner Standard inJava 扫描仪标准
【发布时间】:2015-06-04 19:03:03
【问题描述】:

我使用 Eclipse 作为我的 IDE。我正在阅读一个简单的文件:

1 Andrew
2 Peter
3 Andrew
3 Peter
3 Andrew

我的问题是 Andrew 最后一行的 sc.next() 挂起并且永远不会完成。有没有办法让它在最后一行接受 Andrew,然后退出 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();

在此先感谢您的帮助。

【问题讨论】:

标签: java java.util.scanner


【解决方案1】:

不是一个大 IO 人,但根据我在学校的记忆(使用 C,而不是 Java),我们经常会在文件末尾放置一个转义符(在你的情况下,最后一行可能是“0 EOF ") 然后当 number == 0 和 name.equals("EOF") 时,你就知道要跳出循环了。

编辑:Jakob 似乎可以回答为什么会发生这种情况。

【讨论】:

  • 谢谢,我喜欢这个选项,可以在末尾添加以表示文件结束。
  • 很高兴我能提供帮助,我记得经常在编程挑战中,只要输入不是“0 0”或“EOF”,他们会指定程序继续运行。跨度>
【解决方案2】:

问题

您将hasNextLine()next() 混合使用。当您使用next() 获取数据时,您应该使用hasNext()。另外,你应该知道你可以将整数的解析合并到同一个步骤中,使用sc.nextInt()而不是sc.next()来获取一个整数。

为什么会这样?

sc.nextLine() 吞噬所有内容,直到下一个换行符。 sc.next() 采用下一个空格分隔的标记。 nextLine() 可能有另一个可用的换行符,即使我们已经捕获了所有令牌。

如果您不是从文件中读取,而是在命令行中输入数据,您可能必须在输入输入后按 Control+D,以模拟文件的结尾。

【讨论】:

  • 我一直都在尝试。我从两者得到相同的确切结果。感谢您加强我认为 hasextline 和 nextline 以及 hasext 和 next 应该在一起的想法。抱歉,我扔在这里的副本不匹配。我越来越绝望了!
  • 您尝试使用完全相同的代码,但改用hasNext()
  • 是的,我做到了。它仍然挂在最后一个安德鲁身上
  • 如果您不是从文件中读取而是在命令行中输入数据,您可能需要在输入输入后按 Control+D 来模拟文件的结尾。
【解决方案3】:

您的扫描仪正在从标准输入 (System.in) 中读取,而不是从您的文件 (/YourComputerPath/.../filename) 中读取。您需要更改扫描仪的实例化。

sc = new Scanner(new File("/PathToMyFile/.../myfile"));

【讨论】:

  • 似乎他正在使用输入重定向
  • 我正在使用输入重定向。在 Eclipse 中,您可以在运行配置中进行设置。该程序也可以正常工作,它只是挂在最后一部分。我可以看到前 4 行通过调试器正常工作。
【解决方案4】:

您正在读取输入,而不是从文件中读取,而是从标准输入中读取。因此,除非您将标准输入流关闭到正在运行的 java 进程中,否则Scanner 将始终认为有更多可用输入。

如果您确实设法关闭了标准输入流,那么如果尾随换行符,您的代码也会失败。您应该使用hasNext() 而不是hasNextLine() 来解决这个问题。

如果您想从流中读取数据,我建议在 InputStreamReader 上使用 BufferedReaderreadLine()split()。这不仅可以解决您的问题,还可以使输入更快。

【讨论】:

    【解决方案5】:

    通常最好先读取一个文件,然后再解析它(而不是同时)。一个例子是这样的:

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

    【讨论】:

    • 这个问题是这仍然没有关闭标准输入。所以它仍然挂起。这将与添加 0 EOF 作为最后一行的建议结合使用。
    • 啊,非常正确。我什至没有看输入。不错的收获,@user3352075
    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2012-10-05
    相关资源
    最近更新 更多