Java:清除控制台


Answers:


111

由于此处有几个答案显示了Windows的无效代码,因此请澄清一下:

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

该命令没有工作,有两个原因:

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

  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进程连接到控制台时,即已从命令行启动而没有输出重定向,它将清除控制台。


1
为什么这对我不起作用?我在Windows CMD上运行该程序,但屏幕未清除
-Alist3r

87

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

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


2
真的想添加到此吗?这是什么字符串,如果启用了自动刷新,是否需要刷新?
cossacksman,2015年

7
它们是ANSI转义码屏幕特别清晰,然后是首页。但是为什么需要“家”呢?
jdurston

2
@jdurston省略home不会将光标重置回窗口顶部。
Hugo Zink

1
在Eclipse中不起作用,但在Linux终端中起作用。一票给你
Anh Tuan

7
仅当运行Java的终端仿真器支持ANSI转义码时,此方法才有效。在Windows NT / XP / 7/8/10 CMD不
托尔比约恩Ravn的安徒生

19

这就是我要处理的方式。此方法适用于Windows OS和Linux / Unix OS情况(这意味着它也适用于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中运行,则此方法通常不会清除控制台。


10
在Windows 8.1上:java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
Ben Leggiero 2014年

1
@BenLeggiero如果由于某些原因,JVM在PATH环境变量的某个目录中找不到cls命令,则会发生该错误。这些代码所做的只是根据默认的系统配置调用Windows或Unix系统命令,分别清除命令提示符或终端窗口。它应该与打开终端窗口并键入“ cls”,然后按Enter键完全相同。
Dyndrilliac 2014年

22
clsWindows中没有可执行文件。这是的内部命令cmd.exe
a_horse_with_no_name 2015年

7
正如其他人所说,这根本不起作用,不仅是因为Windows没有cls可执行文件,而且还因为子进程的输出被重定向了。
Holger 2015年

2
这个答案也是关于meta的话题:meta.stackoverflow.com/questions/308950/…–
Petter Friberg

15

一种实现方法是打印多行(“ \ n”)并模拟清晰屏幕。最后,最清楚的是,最多在unix shell中不会删除先前的内容,只会向上移动它,如果向下滚动则可以看到先前的内容。

这是一个示例代码:

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

13
做到这一点的快速方法是印刷的50一个字符串\r\n用单println,因为有之间明显的延迟println调用。
Ben Leggiero 2014年

7
您如何知道控制台配置为显示多少行?在大多数情况下可能有效,但并非全部。
Cypher

4
此属性与适当属性之间的最大区别clear是,后者在屏幕中,新的输出将在屏幕顶部而不是底部。
ndm13'7

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));会更快更好地完成这项工作。
亚伦·埃绍

1
@AaronEsau从JDK 11开始,您可以使用System.out.println(System.lineSeparator().repeat(50));
Holger

15

如果您想要更独立于系统的方式,可以使用JLine库和ConsoleReader.clearScreen()仔细检查当前环境中是否支持JLine和ANSI可能也是值得的。

像下面的代码对我有用:

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中运行它。


14

在您的类中创建一个这样的方法:[就像@Holger 在这里说的。]

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

我不建议您使用此方法。


1
适用于Windows 10!
gaurav

7

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

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

希望这是有用的


如果您可以将缓冲区索引位置设置为开始,那么这将是最简单的方法
DevilInDisguise

1
如果该过程被中断,我想您会发现某些print.out被删除之前的滞后。
TrevorLee19年



1

您可以使用的仿真clsfor (int i = 0; i < 50; ++i) System.out.println();


2
这只是一个提示,也许有人想清除屏幕,实际上
Sarz 2015年

@Sarz:实际上,“清除屏幕”本身也不是很合理
Gyom

0

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

Windows>“首选项运行/调试”>“控制台”,然后选择“ 解释ASCII控制字符”以启用它

Eclipse中的控制台首选项

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

\ t-标签。

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

\ n-新行。

\ r-回车。()

\ f-换页。

蚀控制台清除动画

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.