在Java中按Ctrl + Z后继续读取控制台输入

时间:2014-11-20 17:28:23

标签: java java.util.scanner

对于大学作业,从控制台我需要能够读取多行直到用户输入Ctrl + Z。我没有问题,我的问题在于我之后无法从System.in中读取任何内容,因为它总是抛出NoSuchElementException。

以下是我用于读取多行的代码,它是由教师提供的,因此我不想更改它。

System.out.println("To terminate input, type the correct end-of-file indicator ");
System.out.println("when you are prompted to enter input.");
System.out.println("On UNIX/Linux/Mac OS X type <ctrl> d");
System.out.println("On Windows type <ctrl> z");

Scanner input = new Scanner(System.in);

while (input.hasNext()) {
    //Processes input
    addFileIntoDirectory(input.nextLine());
}

我知道这是由Ctrl + Z引起的,它等同于EOF标记,但我不知道如何移过它。无论我做了多少次读取,无论我是否输入更多的控制台,我都会立即获得另一个NoSuchElementException。

我尝试过为菜单设置一个单独的扫描仪,关闭上面的扫描仪并为菜单打开一个新的扫描仪,但都不起作用。

有没有办法刷新/清除System.in或重置它?

如果您想了解更多详情,请与我们联系。我把这个程序的其余部分保持模糊,因为它是作业。

编辑1:作业说“系统提供如下文字选择菜单, 循环运行。“这意味着程序不会在Ctrl + Z上终止。

  
      
  1. 从用户输入中添加文件
  2.   
  3. 显示整个目录
  4.   
  5. 显示目录的大小
  6.   
  7. 出口   请选择[0-4]:
  8.   

1 个答案:

答案 0 :(得分:3)

简短的回答是:

if (!input.hasNext())
    input = new Scanner(System.in);

答案很长:

下面是代码,其中包含了稍后删除的注释,以便根据我的理解和解决方案来演示问题。

请注意,此演示仅适用于使用整数和^Z输入的工作

复制出代码并保存到文件HN.java进行编译。

运行该程序,它将提示 One 。输入整数到您心中的内容,然后输入^Z退出循环。

将显示两个,然后显示问题中的NoSuchElementFound exception。这是因为^Z 在扫描程序对象input中仍然是,因此nextInt()方法失败。

第一个倾向可能是使用hasNext()来解释这个问题。因此,请继续取消注释/*Comment1并重新编译并再次运行。

现在你避免了这个例外,但程序一直持续到最后,跳过最初想要的nextInt()

现在,取消注释/*Comment2,重新编译,然后再次运行。现在,程序将按照预期在两个提示符处等待。如果您在此输入一个整数,您将进入提示以获取另一个条目。

但是,如果您再次在两次处输入^Z,程序将跳过下一个输入。要更正此问题,请取消注释/*Comment3,重新编译和运行,您将看到该程序适用于所有整数组合,并且^Z可用于各种输入。

现在,您可能想知道我为什么不重用!input.hasNext()中的/*Comment3解决方案。这是一个演示原因:

放回/*Comment3并取消注释/*Comment4,再次编译并运行。该程序在两个提示下输入^Z时效果很好,但是如果你在那里输入一个整数,你会看到系统在等待输入,但是没有提示

这是因为您输入的整数用于前面的nextInt(),因此当程序到达hasNext()时,它会停止并等待输入。

这里的教训是,当您知道队列中有!input.hasNext() 时,使用^Z,例如当它用于在此程序中转义while循环时原始海报的问题。否则,其他结构更适合。

hasNext()令人困惑。你必须记住,如果队列中没有,程序将停止并等待该点的输入。如果你不小心,这可能会搞砸你的提示。

import java.util.Scanner;

public class HN
{
    public static void main(String args[])
    {
        Scanner input = new Scanner(System.in);
        int temp = 0;

        System.out.println("One");

        while (input.hasNext())
        {
            temp = input.nextInt();
        }

        System.out.println("Two");

        /*Comment2
        if(!input.hasNext()) input = new Scanner(System.in);
        Comment2*/

        /*Comment1
        if (input.hasNext())
        Comment1*/

        {   
            temp = input.nextInt();
            System.out.printf("%d\n", temp);
        }

        /*Comment3
        else input = new Scanner(System.in);
        Comment3*/

        /*Comment4
        if(!input.hasNext()) input = new Scanner(System.in);
        Comment4*/

        System.out.println("Three");

        if (input.hasNext()) 
        {   
            temp = input.nextInt();
            System.out.printf("%d\n", temp);
        }

        System.out.println("Four");
    }
}