使控制台等待用户输入以关闭

94

我有一个控制台应用程序,完成任务后必须向用户提供反馈,例如“操作完成”或“操作失败”以及详细错误信息。

问题是,如果我让它“自行运行”,输出消息将被打印,但控制台很快就会关闭,没有时间阅读消息。

据我所知,在C ++中,每个控制台应用程序都将以“按任意键退出”或类似的方式结束。在C#中,我可以使用

Console.ReadKey();

但是我该如何在Java中实现呢?我正在使用Scanner类,但是假设“input”是我的Scanner实例:

input.next()
System.exit(0);

“任何按键”都可以使用,除了回车键,这在此处是非常重要的。有什么指针吗?

8个回答

122
在Java中,这将是System.in.read()

21
这符合“按Enter键退出”的要求,但不符合“按任意键退出”的要求,因为它只有在按下Enter键后才会继续执行。 - Niall Thomson
我想,“按回车键退出”仍然比“按任何键除了回车键退出”要好。谢谢,这对我来说就可以了。 - makoshichi
2
@marcolopes 我有点晚了,但是既然你在问一个应用程序的问题,我猜想问题可能是你让用户在GUI或应用程序的其他地方按下回车键。他们需要在控制台中按下回车键,这很可能只有在IDE中运行时才可见。如果你想在应用程序中按下回车键,你需要另一种解决方案。 - Thunderforge
4
System.in.read() 函数只能读取一个字节,但在不同平台上,按下回车键可能会产生 1 个或多个字节,例如在 Windows 中是 CRLF。因此,在连续调用 read 函数时,首次调用中的 CRLF 可能会被识别为一个 LF 字符,导致程序无需等待输入就直接返回。请注意这一点。 - Thorsten Schöning
2
还需要添加import java.io.IOException; - yu yang Jian

28

我想补充一下,通常只有在连接到控制台时,您才需要程序等待。否则(例如作为pipeline的一部分),打印消息或等待是没有意义的。对此,您可以使用Java的Console,如下所示:

import java.io.Console;
// ...
public static void waitForEnter(String message, Object... args) {
    Console c = System.console();
    if (c != null) {
        // printf-like arguments
        if (message != null)
            c.format(message, args);
        c.format("\nPress ENTER to proceed.\n");
        c.readLine();
    }
}

12

11
public static void main(String args[])
{
    Scanner s = new Scanner(System.in);

    System.out.println("Press enter to continue.....");

    s.nextLine();   
}

这个 nextline 是一个不错的选项,因为它可以帮助我们在按下回车键时运行下一行。


11

你可以使用 nextLine(); 作为暂停。

import java.util.Scanner
//
//
Scanner scan = new Scanner(System.in);

void Read()
{
     System.out.print("Press any key to continue . . . ");
     scan.nextLine();
}

然而,除了Enter键以外,你按下的任何按钮都意味着你之后需要按下Enter键,但我发现这比scan.next();更好。


1
你需要使用 Scanner scan=new Scanner(System.in); - ACV

5
我使用了简单的技巧,请求Windows使用cmd命令,并将其发送到null。
// Class for Different hacks for better CMD Display
import java.io.IOException;
public class CMDWindowEffets
{
    public static void getch() throws IOException, InterruptedException
    {
        new ProcessBuilder("cmd", "/c", "pause > null").inheritIO().start().waitFor();
    }    
}

3
我已经加入了x4u所说的内容。Eclipse要求在它周围放置try catch块,所以我让它为我生成。
try {
        System.in.read();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

它可能拥有各种炫酷的功能,但我认为对于想要一个不关闭命令行窗口的初学者来说,这应该是可以的。

此外,我不知道这个情况有多普遍(这是我第一次制作jar文件),但它不能独立运行,只能通过bat文件运行。

java.exe -jar mylibrary.jar

以上是同一文件夹中批处理文件的内容。看起来是一个安装问题。

Eclipse教程来源于:http://eclipsetutorial.sourceforge.net/index.html

部分答案也来自:Oracle Thread


1
一个简单的技巧:

import java.util.Scanner;  

/* Add these codes at the end of your method ...*/

Scanner input = new Scanner(System.in);
System.out.print("Press Enter to quit...");
input.nextLine();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接