JAVA 中如何清除console的输出

您所在的位置:网站首页 eclipse清屏 JAVA 中如何清除console的输出

JAVA 中如何清除console的输出

2024-07-14 08:23| 来源: 网络整理| 查看: 265

首先给上答案连接,请看最多赞的答案 http://stackoverflow.com/questions/2979383/java-clear-the-console

一般的帖子里会给出这样的答案

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

然而 Windows 亲自测试这个命令无法运行,会报出如下错误(在Eclipse和CMD中都会这样):

Cannot run program "cls": CreateProcess error=2, 系统找不到指定的文件。

出错的原因是有如下两点

在标准的 Windows 安装中并没有叫 cls.exe 或者 cls.com 的可执行程序,而 Runtime.exec 命令正是因为这个原因无法被调用,可以看错误信息“系统找不到制定的文件”。我们所熟知的 cls 命令是 Windows 命令行解释器内嵌的命令(说白了就是 cmd.exe 程序中的命令,而不是 Windows 的命令)

当通过 Runtime.exec 命令进入一个进程后,其标准输出(就是 Runtime.exec 所执行命令的输出)被重定向到了一个新的管道(pipe),这个管道对于原来的 Java 进程也是可见的。但是 cls 命令的输出被重定向没有什么意义,因为 Java 进程所运行的那个窗口并不是执行 cls 命令的窗口(这一条并非出错的原因,但是下面解决办法的原理)

为了解决这一问题,我们必须先启动命令行解释器(cmd.exe)并且告诉 cmd 我们想执行一个清屏操作(/c cls)(这里的 /c 的作用我是这样理解的,实际执行了 cmd /c cls 后,我们看见的命令行已经不是原来的命令行了,而是新打开的命令行,因为这命令的意思是打开一个命令行,清屏并关闭原来的命令行),这样才能使用 cmd 内建的命令;此外,我们也必须将 cmd 的输出通道和 Java 进程的输出通道直接相连接,这个功能从 Java 7 开始被支持,其函数是 inheritIO(),具体代码如下:

import java.io.IOException; public class CLS { public static void main(String args[]) throws IOException, InterruptedException { // ... new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor(); // 清屏命令 // ... } }

关于上面的几句命令我是这样理解的

new ProcessBuilder("cmd", "/c", "cls")

就是新建一个 ProcessBuilder,其要执行的命令是 cmd.exe,参数是 /c 和 cls

.inheritIO()

这个函数上面介绍了,就是将 ProcessBuilder 对象的输出管道和 Java 的进程进行关联,这个函数的返回值也是一个 ProcessBuilder,但是建立了关联之后的 ProcessBuilder。

.start()

开始执行 ProcessBuilder 中的命令

.waitFor()

等待 ProcessBuilder 中的命令执行完毕(我猜测可能如果不执行这个等待命令,可能会出现清屏代码后面的输出被清掉的情况,没尝试过)

这样一来当 Java 进程被直接连接到控制台,而没有被重定向,清屏功能就可以实现了。

经过实际测试,在Eclipse 的控制台输出里是不行的(从以上的原理中可以知道其原因,因为这个命令连接到的是 cmd 而不是Eclipse 的控制台),打包成 jar 包,运行 java -jar ***.jar 就可以了(不过偶尔清屏还可以,想实现刷新效果还是差了点,晃眼睛。。。)

PS:其他的还有一个方法没有测试过,代码如下

System.out.print("\033[H\033[2J"); System.out.flush();

据说这个代码在基于 UNIX 的机子上都能行,不过没试过。在 Linux 上我也没试过如下代码

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

但感觉上应该没问题



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3