【问题标题】:Make the console wait for a user input to close使控制台等待用户输入关闭
【发布时间】:2011-08-27 06:56:50
【问题描述】:

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

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

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

来模拟这种行为
Console.ReadKey();

但是我如何在 Java 中做到这一点?我正在使用 Scanner 类,但鉴于“输入”是我的 Scanner 实例:

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

“任何键”都可以,除了 return,这在这里很重要。有什么指点吗?

【问题讨论】:

    标签: java console-application


    【解决方案1】:

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

    【讨论】:

    • 这满足“Press enter to exit”但不满足“Press any key to exit”,因为直到按下回车键才会继续。
    • 我想“按回车退出”仍然比“按任何键,除了回车退出”要好。谢谢,这对我有用。
    • @marcolopes 我参加聚会有点晚了,但既然你问的是一个应用程序,我猜问题是你让用户在GUI 或应用程序中的其他位置。他们需要在控制台中按回车键,这很可能只有在 IDE 中运行时才可见。如果您想在应用中按 Enter,则需要不同的解决方案。
    • System.in.read() 只读取一个字节,但 ENTER 在不同平台上可能会产生 1 个或更多字节,请记住 Windows 上的 CRLF。因此,后续调用 read 可能直接从第一次调用的 CRLF 返回 LF,因此应用程序根本不等待输入。
    • 还需要添加import java.io.IOException;
    【解决方案2】:

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

    有以下两个讨论: Detecting and acting on keyboard direction keys in JavaJava keyboard input parsing in a console app

    后者使用JLine解决了他的问题。

    我个人没用过。

    【讨论】:

      【解决方案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
      

      以上是bat文件在同一个文件夹中的内容。似乎是安装问题。

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

      部分答案也来自:Oracle Thread

      【讨论】:

        【解决方案4】:

        我想补充一点,通常您希望程序仅在连接到控制台时才等待。否则(就像它是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();
            }
        }
        

        【讨论】:

          【解决方案5】:

          你可以使用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(); 更好

          【讨论】:

          • 你需要使用Scanner scan=new Scanner(System.in);
          【解决方案6】:

          我使用了简单的hack,要求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();
              }    
          }
          

          【讨论】:

            【解决方案7】:
            public static void main(String args[])
            {
                Scanner s = new Scanner(System.in);
            
                System.out.println("Press enter to continue.....");
            
                s.nextLine();   
            }
            

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

            【讨论】:

              【解决方案8】:

              一个简单的技巧:

              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();
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-12-25
                相关资源
                最近更新 更多