5

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

hasNext()方法何时阻塞以及如何控制它?有趣的是,它在块前的 3 个案例中工作得非常好。JavaAPI 还描述hasNext()为检查是否存在另一个 Input 的正确方法,以便该方法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,但这不应该是一个问题 - 至少到目前为止还不是一个问题。

4

3 回答 3

9

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

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

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

于 2013-06-01T15:00:01.790 回答
1

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

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

于 2013-06-01T13:23:56.907 回答
1

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

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

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

扫描仪将被阻塞!

于 2016-08-02T15:42:20.640 回答