当前位置: 首页 > 知识库问答 >
问题:

hasNext() -什么时候阻塞,为什么?

张伯寅
2023-03-14

我正在尝试通过扫描仪对象读取命令。为了检查输入语法,我使用<code>sc。hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我看到了JavaAPI中描述的“MAY block and wait for Input”的情况。

hasNext()方法何时阻塞,我如何控制它?有趣的是,在街区前的3个案例中,它工作得非常好。此外,JavaAPI还将hasNext()描述为检查是否存在另一个Input的正确方法,从而使方法next()不会产生异常

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

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,但这不应该是一个问题——至少到目前为止还不是。

共有3个答案

叶卓君
2023-03-14

我不确定,但以下是我自己的经验:
当Scanner对象被输入文件时,它不会被阻塞
术语“用文件馈送”是指扫描仪的结构如下:
扫描仪扫描仪=新扫描仪(“myFile.txt”)但如果扫描仪是使用Socket对象getInputStream()方法构造的,如下所示:

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

扫描仪会阻塞!

许奇
2023-03-14

如果在等待用户输入时没有其他事情可做,则可以在该调用中被阻止,直到下一个输入到达。

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

翟俊名
2023-03-14

通过控制台或通过TextFile进行测试是有区别的。如果我从控制台读取,程序期望流,它将等待进一步的输入。

当通过来自文本文件的输入进行测试时(对于扫描仪,仍然使用System.in,使用Java程序), hasNext()将在文件末尾返回false,因为没有进一步的输入可以完成。

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

 类似资料:
  • 问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码

  • 问题内容: 注意:这不是有关settimeout的复制文章,此处的关键答案是浏览器设计选项。 我开始研究node.js:一个测试异步的简单示例: 一件有趣的事情是,在带有curl的lind命令和浏览器中,它的行为是不同的:在Ubuntu 12.10中,我在两个控制台中使用curl localhost:8080,它们在几乎相同的10个发送中进行响应。 但是,我打开了两个浏览器,几乎同时发出了请求,但

  • 问题内容: 我应该开发一个简单的SFTP。 一切都进行得很好,直到我(在本例中)没有编写全部为止。可以请我解释一下,为什么系统挂在我身上吗? 服务器端: 客户端: 问题答案: 您的循环一直运行到流结束,但是对等方永远不会关闭套接字。该协议似乎要求打开套接字以供其他命令使用,因此您必须调整它的这一部分以包括一个长度字前缀,以便您知道要复制多少字节。 问题不是关于不写所有字节,而是关于阻塞in 。

  • 问题内容: 我是一名即将毕业的计算机科学专业的学生,​​在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除

  • 我不明白为什么webclient会阻止我使用gradle的主要netty线程,以下是它的依赖项: 这个gradle脚本在两个应用程序中都使用。在第一个应用程序中,我执行: 第二个应用程序模拟长响应处理: 我希望呼叫服务不会阻塞主线程,而是会继续处理传入的连接,但直到我收到第一个呼叫的响应(睡眠将起作用),我的下一个连接将挂起等待。 结果:第一个应用程序像tomcat一样工作,只有一个线程 我的问题

  • 线程实例的join()方法可用于将一个线程的执行开始“连接”到另一个线程的执行结束,这样一个线程在另一个线程结束之前不会开始运行。如果对线程实例调用join(),则当前运行的线程将阻塞,直到线程实例完成执行 但是如果我有多个线程并且当我在循环内部调用join时。所有线程并行运行。但是根据连接的概念,首先连接的线程应该完成,然后只有主线程才允许连接其他线程。 } 在上面的代码中,如果第一个线程被连接