gpt4 book ai didi

java - Java中Ctrl+Z后继续阅读控制台输入

转载 作者:行者123 更新时间:2023-12-01 22:34:41 26 4
gpt4 key购买 nike

对于大学作业,我需要能够从控制台读取多行,直到用户输入 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());
}

我知道这是由相当于 EOF 标记的 Ctrl+Z 引起的,但我不知道如何越过它。无论我执行了多少次读取,无论我是否在控制台中输入了更多内容,我都会立即返回另一个 NoSuchElementException。

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

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

如果您想了解更多详细信息,请告诉我。我对程序的其余部分保持模糊,因为它是家庭作业。

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

  1. add files from user inputs
  2. display the whole directory
  3. display the size of directory
  4. exit Please give a selection [0-4]:

最佳答案

简短的答案是:

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

长答案是:

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

请注意,此演示仅使用整数和^Z输入。

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

运行程序,会提示One。输入您喜欢的整数,然后输入 ^Z 退出循环。

将显示

Two,后跟问题中的 NoSuchElementFound 异常。这是因为 ^Z 保留在 Scanner 对象 input 中,因此在 nextInt() 方法上失败。

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

现在您避免了异常,但程序会一直执行到最后,跳过最初预期的 nextInt()

现在,取消注释 /*Comment2,重新编译并再次运行。现在,程序将按预期等待 Two 提示符。如果您在此处输入整数,您将进入提示进行另一项输入。

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

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

放回/*Comment3并取消/*Comment4的注释,再次编译运行。该程序在 Two 提示符下输入 ^Z 时运行良好,但如果您在此处输入一个整数,您将看到系统正在等待输入,但有没有提示!

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

这里的教训是,当您知道队列中有 ^Z 时,请使用 !input.hasNext()它用于逃避该程序中的 while 循环和原始海报的问题。否则,else 结构更适合。

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");
}
}

关于java - Java中Ctrl+Z后继续阅读控制台输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27045832/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com