【问题标题】:How to clear the console?如何清除控制台?
【发布时间】:2011-02-28 02:14:21
【问题描述】:

谁能告诉我Java中用于清除屏幕的代码是什么?

例如,在 C++ 中:

system("CLS");

Java中用什么代码清屏?

【问题讨论】:

标签: java console


【解决方案1】:

由于这里有几个答案显示 Windows 的非工作代码,所以这里澄清一下:

Runtime.getRuntime().exec("cls");

此命令不起作用,原因有两个:

  1. 在标准 Windows 安装中没有名为 cls.execls.com 的可执行文件可以通过 Runtime.exec 调用,因为众所周知的命令 cls 内置于 Windows 的命令行解释器中。

  2. 当通过Runtime.exec 启动一个新进程时,标准输出被重定向到启动Java 进程可以读取的管道。但是当cls 命令的输出被重定向时,它不会清除控制台。

为了解决这个问题,我们必须调用命令行解释器 (cmd) 并告诉它执行一个允许调用内置命令的命令 (/c cls)。此外,我们必须将其输出通道直接连接到 Java 进程的输出通道,该通道从 Java 7 开始工作,使用 inheritIO()

import java.io.IOException;

public class CLS {
    public static void main(String... arg) throws IOException, InterruptedException {
        new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
    }
}

现在当 Java 进程连接到控制台时,即从命令行启动而没有输出重定向,它将清除控制台。

【讨论】:

  • 为什么这对我不起作用?我在 windows CMD 上运行程序,但屏幕没有清除
【解决方案2】:

您可以使用以下代码清除命令行控制台:

public static void clearScreen() {  
    System.out.print("\033[H\033[2J");  
    System.out.flush();  
}  

更多参考请访问:http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html

【讨论】:

  • 想添加这个吗?这个字符串是什么,如果启用了自动刷新,你需要刷新吗?
  • 他们是ANSI escape codes。特别是clear screen, followed by home。但为什么需要“家”呢?
  • @jdurston 省略 home 不会将光标重置回窗口顶部。
  • 不能在 Eclipse 中工作,但在 Linux 终端中工作。一票给你
  • 这仅在运行 Java 的终端仿真器支持 ANSI 转义码时才有效。 Windows NT/XP/7/8/10 CMD 没有
【解决方案3】:

这就是我的处理方式。此方法适用于 Windows 操作系统和 Linux/Unix 操作系统(这意味着它也适用于 Mac OS X)。

public final static void clearConsole()
{
    try
    {
        final String os = System.getProperty("os.name");

        if (os.contains("Windows"))
        {
            Runtime.getRuntime().exec("cls");
        }
        else
        {
            Runtime.getRuntime().exec("clear");
        }
    }
    catch (final Exception e)
    {
        //  Handle any exceptions.
    }
}

请注意,如果您在 IDE 中运行,此方法通常不会清除控制台。

【讨论】:

  • 在 Windows 8.1 上:java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
  • @BenLeggiero 如果由于某种原因JVM 在PATH 环境变量的某个目录中找不到cls 命令,则会发生该错误。这段代码所做的只是根据默认系统配置调用 Windows 或 Unix 系统命令来分别清除命令提示符或终端窗口。它应该与打开终端窗口并键入“cls”然后按 Enter 键完全相同。
  • Windows 中没有cls 可执行文件。这是cmd.exe内部命令。
  • 别人说的doesn’t work at all,不仅是因为windows没有cls可执行文件,还因为子进程的输出被重定向了。
  • 这个答案也是meta上的话题请看:meta.stackoverflow.com/questions/308950/…
【解决方案4】:

像这样在你的类中创建一个方法:[as @Holger said here.]

public static void clrscr(){
    //Clears Screen in java
    try {
        if (System.getProperty("os.name").contains("Windows"))
            new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
        else
            Runtime.getRuntime().exec("clear");
    } catch (IOException | InterruptedException ex) {}
}

这至少适用于 Windows,到目前为止我还没有检查过 Linux。如果有人检查它是否适用于 Linux,请让我知道它是否有效(或无效)。

另一种方法是把这段代码写在clrscr():

for(int i = 0; i < 80*300; i++) // Default Height of cmd is 300 and Default width is 80
    System.out.print("\b"); // Prints a backspace

我不建议你使用这种方法。

【讨论】:

    【解决方案5】:

    实现这一点的一种方法是打印多个行尾 ("\n") 并模拟清屏。最后明确,最多在unix shell中,不删除之前的内容,只是向上移动,向下滚动可以看到之前的内容。

    这是一个示例代码:

    for (int i = 0; i < 50; ++i) System.out.println();
    

    【讨论】:

    • 实现此目的的更快方法是打印一个包含 50 个 \r\n 的字符串和一个 println,因为在 println 调用之间存在明显的延迟。
    • 如何知道控制台配置显示多少行?在大多数情况下可能有效,但不是全部。
    • 这个和正确的clear最大的区别在于,在后者中,新的输出将在屏幕的顶部而不是底部。
    • System.out.println(new String(new char[50]).replace("\0", "\r\n")); 会更快更好地完成这项工作。
    • @AaronEsau 从 JDK 11 开始,您可以使用 System.out.println(System.lineSeparator().repeat(50));
    【解决方案6】:

    如果您想要一种更独立于系统的方式来执行此操作,您可以使用JLine 库和ConsoleReader.clearScreen()。谨慎检查当前环境中的JLine and ANSI is supported 是否也值得做。

    以下代码对我有用:

    import jline.console.ConsoleReader;
    
    public class JLineTest
    {
        public static void main(String... args)
        throws Exception
        {
            ConsoleReader r = new ConsoleReader();
    
            while (true)
            {
                r.println("Good morning");
                r.flush();
    
                String input = r.readLine("prompt>");
    
                if ("clear".equals(input))
                    r.clearScreen();
                else if ("exit".equals(input))
                    return;
                else
                    System.out.println("You typed '" + input + "'.");
    
            }
        }
    }
    

    运行此程序时,如果您在提示符处键入“clear”,它将清除屏幕。确保从正确的终端/控制台而不是在 Eclipse 中运行它。

    【讨论】:

      【解决方案7】:

      尝试以下方法:

      System.out.print("\033\143");
      

      这在 Linux 环境下可以正常工作

      【讨论】:

      • 应该在最上面!在 Linux 控制台上工作。
      • 谢谢!曾在 Linux、Android 和 Mac OS X 上工作。
      【解决方案8】:

      Runtime.getRuntime().exec(cls) 在我的 XP 笔记本电脑上不起作用。这确实 -

      for(int clear = 0; clear < 1000; clear++)
        {
           System.out.println("\b") ;
        }
      

      希望对你有用

      【讨论】:

      • 如果您可以设置缓冲区索引位置开始,这将是唯一最简单的方法
      • 如果进程被中断,我想你会看到一些 print.out 被删除的滞后。
      【解决方案9】:

      通过结合所有给定的答案,此方法应该适用于所有环境:

      public static void clearConsole() {
          try {
              if (System.getProperty("os.name").contains("Windows")) {
                  new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
              }
              else {
                  System.out.print("\033\143");
              }
          } catch (IOException | InterruptedException ex) {}
      }
      

      【讨论】:

        【解决方案10】:

        如果您在 Bluej 或任何其他类似软件中执行此操作,这将起作用。

        System.out.print('\u000C');
        

        【讨论】:

          【解决方案11】:

          试试这个:仅适用于控制台,不适用于 NetBeans 集成控制台。

          public static void cls(){
              try {
          
               if (System.getProperty("os.name").contains("Windows"))
                   new ProcessBuilder("cmd", "/c", 
                            "cls").inheritIO().start().waitFor();
               else
                   Runtime.getRuntime().exec("clear");
              } catch (IOException | InterruptedException ex) {}
          }
          

          【讨论】:

            【解决方案12】:

            您可以将cls 的模拟与 for (int i = 0; i &lt; 50; ++i) System.out.println();

            【讨论】:

            • 只是一个提示,可能有人要清屏,其实
            • @Sarz:实际上“清除屏幕”本身也没有任何意义
            【解决方案13】:

            您需要使用控制字符作为反斜杠 (\b) 和回车 (\r)。它默认禁用,但控制台视图可以解释这些控件。

            Windows>PreferencesRun/Debug > Console 并选择 Interpret ASCII control characters 以启用它

            完成这些配置后,您可以使用以下控制字符来管理控制台:

            \t - 制表符。

            \b - 退格(文本后退一步或删除单个字符)。

            \n - 换行。

            \r - 回车。 ()

            \f - 换页。

            更多信息请访问:https://www.eclipse.org/eclipse/news/4.14/platform.php

            【讨论】:

            • 很好,但您没有说明如何使用这些来清除 Eclipse 控制台。
            【解决方案14】:

            您需要使用 JNI。

            首先使用 Visual Studio 创建一个 .dll,调用 system("cls")。 之后使用 JNI 来使用这个 DDL。

            我发现这篇文章很好:

            http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5170&lngWId=2

            【讨论】:

            • 这对我有用。我有一个真实的项目使用JNI在JAVA中清屏。
            • 在匈牙利,我们说“他用狼牙棒击打苍蝇。”
            • 在俄罗斯我们说“他用大炮射麻雀”或“他用显微镜钉钉子”
            猜你喜欢
            • 2021-12-10
            相关资源
            最近更新 更多