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

mak*_*chi 74 java console-application

我有一个控制台应用程序,在执行其任务后,必须向用户提供反馈,例如"操作已完成"或"操作失败"以及详细错误.

问题是,如果我只是"让它运行",输出消息将被打印,但控制台将很快关闭,没有时间阅读消息.

据我所知,在C++中,每个控制台应用程序都将以"按任意键退出"或类似的结尾.在C#中我可以用a来模拟这种行为

Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)

但是我怎么能用Java做呢?我正在使用Scanner类,但鉴于"输入"是我的Scanner实例:

input.next()
System.exit(0);
Run Code Online (Sandbox Code Playgroud)

"任何关键"都可以使用,除了返回,这在这里是非常重要的.有什么指针吗?

x4u*_*x4u 90

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

  • 这满足"按Enter键退出"而不是"按任意键退出",因为在按下回车键之前它不会继续. (13认同)
  • System.in.read()只读取一个字节,但是ENTER可能在不同平台上产生1个或更多字节,请记住Windows上的CRLF.因此,后续的read调用可能会直接从第一次调用的CRLF返回LF,因此应用程序根本不会等待输入. (4认同)
  • @marcolopes我有点迟到了,但是因为你问的是一个应用程序,我猜测问题是你让用户点击GUI中的回车键或应用程序中的其他地方.他们需要在控制台中点击回车键,如果您在IDE中运行它,很可能只能看到它.如果您想在应用程序中按Enter键,则需要一个不同的解决方案. (2认同)
  • 还需要添加“import java.io.IOException;”。 (2认同)

Pet*_*lák 19

我想补充一点,通常你会希望程序只有在连接到控制台时才会等待.否则(如果它是管道的一部分)没有必要打印消息或等待.为此你可以Console像这样使用Java :

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 11

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

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

    s.nextLine();   
}
Run Code Online (Sandbox Code Playgroud)

nextline是一个非常好的选项,因为每当按下回车键时它都会帮助我们运行下一行。


Rev*_*nzo 7

Java控制台输入的问题是它是缓冲输入,需要输入键才能继续.

有两个讨论: 在控制台应用程序中检测JavaJava键盘输入解析中的键盘方向键

后者使用JLine解决他的问题.

我个人没有用过它.


小智 7

你可以nextLine();暂停使用

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

void Read()
{
     System.out.print("Press any key to continue . . . ");
     scan.nextLine();
}
Run Code Online (Sandbox Code Playgroud)

但是你按下的任何按钮除外Enter意味着你必须在此之后按Enter键,但我发现它比它好scan.next();


小智 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();
    }    
}
Run Code Online (Sandbox Code Playgroud)