10

Java 清空控制台输出

 2 years ago
source link: https://blog.diqigan.cn/posts/java-clear-console.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文通过两种方法讲述了 Java 如何清空控制台输出,达到类似 Linux 中 top 命令的效果。

两种方法均在 Linux 环境中测试通过,Windows 环境请自行测试,理论可行。

下列代码需要在控制台执行才会有清除控制台效果,在 IDE 中执行无效。

使用 ASCI 控制码清空控制台

通过输出 ASCI 控制码清空控制台,代码如下:

/**
* ConsoleClear
*
* @author seven
* @date 2021-04-14 21:49
*/
public class ConsoleClear {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
// 清空控制台并把光标停留在起始位置
System.out.print("\033[H\033[2J");
// 效果同上
// System.out.print("\033[0;0H\033[2J");
System.out.fulsh();
}
}

另外,ASCI 控制码还可以实现前景色、背景色、下划线、消隐、闪烁效果的设置以及光标控制,具体方法请阅读参考文档。

通过 ProcessBuilder 清空控制台

ProcessBuilder 本质上是调用了系统命令来达到清空控制台的效果,代码如下:

import java.io.IOException;

/**
* ConsoleClear
*
* @author seven
* @date 2021-04-14 21:49
*/
public class ConsoleClear {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
// 清空控制台
try {
final String os = System.getProperty("os.name");
// 根据不同环境执行不同命令
if (os.contains("Windows")) {
// 新建一个 ProcessBuilder,Windows 下要执行的命令是 cmd.exe,参数是 /c 和 cls
new ProcessBuilder("cmd", "/c", "cls")
//将 ProcessBuilder 对象的输出管道和 Java 的进程进行关联,这个函数的返回值也是一个 ProcessBuilder
.inheritIO()
//开始执行 ProcessBuilder 中的命令
.start()
//等待 ProcessBuilder 中的清屏命令执行完毕
//如果不等待则会出现清屏代码后面的输出被清掉的情况
.waitFor();
} else {
// 新建一个 ProcessBuilder,Linux 下要执行的命令是 clear
new ProcessBuilder("clear")
//将 ProcessBuilder 对象的输出管道和 Java 的进程进行关联,这个函数的返回值也是一个 ProcessBuilder
.inheritIO()
//开始执行 ProcessBuilder 中的命令
.start()
//等待 ProcessBuilder 中的清屏命令执行完毕
//如果不等待则会出现清屏代码后面的输出被清掉的情况
.waitFor();
}
} catch (final IOException | InterruptedException e) {
System.out.println("Clear Console Failed.");
}
}
}

可以将 ProcessBuilder 部分代码封装一下,这里为了便于理解,直接写了两次。

不存在的方法三

网上还盛传另一种方法,核心代码是:

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

我自己亲测无效,各位看官感兴趣的话还请自行踩坑 / 避坑。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK