【发布时间】:2011-06-20 18:37:34
【问题描述】:
Java 中的哪个命令可以让您在命令行应用程序中清除控制台?
【问题讨论】:
-
请澄清。什么画面?控制台?
-
顺便说一下哪个屏幕?
Java 中的哪个命令可以让您在命令行应用程序中清除控制台?
【问题讨论】:
我认为OP想要的是清除屏幕并将光标移动到主位置。对于该尝试:
final String ANSI_CLS = "\u001b[2J";
final String ANSI_HOME = "\u001b[H";
System.out.print(ANSI_CLS + ANSI_HOME);
System.out.flush();
【讨论】:
这取决于你的控制台,但如果它支持ANSI escape sequences,那么试试这个..
final static String ESC = "\033[";
System.out.print(ESC + "2J");
【讨论】:
运行此示例程序:它演示了如何使用转义序列清除控制台并将光标重新定位到 X=1、Y=1 的位置。
我在几个 Linux 终端上对其进行了测试。不知道,它是否可以在 Windows 下运行。
也许你可以告诉我 ;)
阅读this article 了解转义序列。
import java.io.*;
public class Main {
public static final char ESC = 27;
public static void main(String[] args)
throws Exception {
Console c = System.console();
if (c == null) {
System.err.println("no console");
System.exit(1);
}
// clear screen only the first time
c.writer().print(ESC + "[2J");
c.flush();
Thread.sleep(200);
for (int i = 0; i < 100; ++i) {
// reposition the cursor to 1|1
c.writer().print(ESC + "[1;1H");
c.flush();
c.writer().println("hello " + i);
c.flush();
Thread.sleep(200);
}
}
}
【讨论】:
buffer = System.out; System.out.print(ESC+"[1;1H"); System.out.flush(); System.out.println("Lorem ispum ....");System.out.print(ESC+"[1;1H"); System.out.flush(); System.out.println(buffer);
清除屏幕通常需要发送特殊的控制序列特定于您的应用程序正在运行的屏幕/终端。选项:
如果您知道您将始终在特定终端下运行,并且可以找到适当的控制序列来清除该终端的屏幕,则只需输出这些序列。如果您告诉我们屏幕,我们或许可以告诉您顺序(它可能有点 ANSI/VT100/VT220 兼容)。
从外部确保您的应用始终在所需的终端中运行,例如启动应用程序的脚本在所需的终端中启动应用程序。然后输出必要的字符序列来清屏。
通过使用终端仿真库来控制终端,即您的应用现在是一个窗口应用,它创建一个终端窗口屏幕供用户使用。然后,您可以控制要模拟的终端,并知道需要哪些控制序列。
使用可检测终端并为其功能提供统一接口的终端库(例如,像历史悠久的 curses 库)。看到这个问题:
What's a good Java, curses-like, library for terminal applications?
通过在屏幕上写一堆行来伪造它。
【讨论】:
清除对我有用的 bash:
System.out.print(String.format("\033[H\033[2J"));
【讨论】:
如果上述解决方案都不适合您(如我的情况),请尝试以下解决方案:
new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
我使用的是 Windows 8,这个解决方案对我有用。希望它对你也一样。 :)
【讨论】:
总是有明显的(和笨拙的)..
int numRowsInConsole = 60;
for (int ii=0; ii<numRowsInConsole; ii++) {
// scroll down one line
System.out.println("");
}
【讨论】:
System.out.println()。
System.out.println("Hello!");
打印指定的字符串,然后将光标移动到下一行。
System.out.print("Hello!");
打印指定的字符串并在该字符串之后立即离开光标。
要解决上面提到的光标位于控制台第二行的问题,请使用print 而不是println。
【讨论】:
我在 BlueJ 中做了这个并且效果很好:试试 System.out.print("\f");
【讨论】:
据我所知,尽管有传言,Windows 10 的命令行窗口 cmd.exe 本身并不支持 ANSI ESC 序列。拥有:
final String ANSI_CLS = "\u001b[2J";
System.out.print(ANSI_CLS);
方法工作你需要一个支持ANSI的命令行模拟器,比如ConEmu64。
【讨论】:
有两种非常简单的方法可以解决这个问题,第一种是蛮力选项:
for (int i=1; i<=10; i++)
System.out.println("\n");
但问题是它只是伪清屏,你可以向上滚动查看数据,但不要害怕,还有另一种方法!
System.out.println("\f");
瞧!这应该可以解决问题,尽管您的光标将在屏幕被清除后位于控制台的第二行。
【讨论】: