【问题标题】:hasNext() - when does it block and why?hasNext() - 它什么时候阻塞,为什么?
【发布时间】:2013-05-28 05:03:11
【问题描述】:

我正在尝试通过 Scanner 对象读取命令。为了检查输入语法,我使用sc.hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我遇到了 JavaAPI 中描述为“可能阻塞并等待输入”的情况。

hasNext() 方法何时阻塞以及如何控制它?有趣的是,它在块前的 3 个案例中工作得非常好。此外,JavaAPI 将hasNext() 描述为检查是否存在另一个输入的正确方法,因此方法next() 不会产生Exception

这是我到目前为止生成的代码:

if (sc.hasNext() && sc.next().equals("create")) {
    if (sc.hasNextInt()) {
        width = sc.nextInt();
        if (width > 0) {
            if (sc.hasNextInt()) {
                heigth = sc.nextInt();
                if (heigth > 0) {
                    if (sc.hasNext()) {  //At this point the hasNext Statement blocks for //no reason till an Input is made.
                        charset = sc.next();
                        Image = new AsciiImage(width, heigth,charset);
                    } else {
                        ret = false;
                        System.out.println("INPUT MISMATCH");
                    }
                } ...//and so on

提前致谢,我在这个主题上找不到任何我自己的东西。 编辑:扫描仪被定义为 System.in,但这不应该是一个问题 - 至少到目前为止还不是一个问题。

【问题讨论】:

  • 如果没有可用的输入,您认为hasNext 应该返回什么?除了阻塞直到它看到流的结尾或下一个令牌,如何知道是否有存在下一个令牌?
  • 当且仅当此扫描器具有 API 所述的另一个令牌时才为真。有点奇怪......我应该用什么代替?它也适用于我程序中的所有其他 hasNext 语句 - 在其他所有情况下:No Input --> false --> break.
  • 不清楚您要做什么。您需要了解扫描仪基于流输入 - 如果当前没有可用数据但流未关闭,那么稍后可能会有更多数据......并且它必须等待该信息才能返回任何内容有用。
  • 您正在使用阻塞 IO,并且您已通过调用 hasNext() 请求输入。它会一直阻塞,直到有输入(并返回 true)或底层流关闭(并返回 false)。
  • 看来你是对的,我完全误解了 hasNext() ......我确实用它来检查更多条目。这在一段时间内完全没问题,如果我想检查下一个单词是否是整数,这是有道理的。好吧,有点假设错了。感谢您的提示,由于与其他人无关,我是否应该删除此问题?

标签: java java.util.scanner


【解决方案1】:

通过控制台或通过 TextFile 进行测试是有区别的。如果我从控制台读取程序需要一个 Stream 并且它将等待进一步的输入。

当通过 Textfile 中的 Input 进行测试时(仍然使用 System.in 作为 Scanner,使用 Java Program),hasNext() 将在文件末尾返回 false,因为无法进行进一步的 Input。

我真的找不到关于这个主题的文档(https://docs.oracle.com/javase/9/docs/api/java/util/Scanner.html#hasNext--)。因此,如果有人找到正确且技术上正确的答案,我会非常高兴。

【讨论】:

    【解决方案2】:

    如果您在等待用户输入时无事可做,则可以在该调用中阻塞直到下一个输入到达。

    如果您确实想在等待输入时运行其他代码,请生成一个新线程并从那里调用 hasNext 和其他阻塞扫描器方法。

    【讨论】:

    • 我必须检查一个命令的语法是否正确,例如:create int int String。如果未输入三个参数之一,则应显示错误。似乎正在测试我的程序的服务器以不同的方式输入数据,很可能只是从文本文件中读取,其中没有预期的更改并且 hasNext() 返回 false。我通过控制台进行了测试-> hasNext() 等待。无论如何,谢谢。
    【解决方案3】:

    我不确定,但以下是我自己的经验:
    当 Scanner 对象被提供一个文件时,它不会被阻塞!
    “文件馈送”一词是指扫描仪的结构如下:
    Scanner scanner = new Scanner("myFile.txt");

    但是如果扫描仪是使用 Socket 对象的 getInputStream()method 构造的,像这样:

    input = socket.getInputStream();
    Scanner scanner = new Scanner(input);
    

    扫描仪将被阻塞!

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 2011-09-09
      • 2019-09-04
      • 2017-04-26
      • 2023-02-22
      • 2021-10-05
      • 2012-10-31
      • 2012-04-15
      • 2012-08-23
      相关资源
      最近更新 更多