【问题标题】:Ways to Clear the Console?清除控制台的方法?
【发布时间】:2013-10-11 16:58:00
【问题描述】:

我在这方面已经有一段时间了,在过去的三天里,我一直在互联网上寻找有效清除 Java 控制台的方法。

我看到它“完成”的方式

这边 for(int x = 0; x!=100; x++){ System.out.println(); } 糟透了,因为您可以向上滚动并再次查看打印的报表。

Console.Clear(); 和它的所有变体对我都不起作用。

Runtime.getRuntime().exec("cls"); 在我尝试使用它的任何情况下都不起作用。

(我使用 JCreator 编写代码,我不知道这是否与我的问题有关)

这种方式 by joesumbody122,看起来很有趣:

 private static void clearLine()
 {
       Console.Write(new string(' ', Console.BufferWidth - Console.CursorLeft));
 }

private static void clearLine(int left, int top)
{    

int pLeft = Console.CursorLeft;
int pTop  = Console.CursorTop;

Console.setCursorPosition(left, top);
Console.Write(new string(' ', Console.BufferWidth - Console.CursorLeft));

Console.setCursorPosition(pLeft, pTop);
}

但遗憾的是,我无法让它为我工作。它给了我错误,他从控制台调用的所有方法都不存在。 java.io.*; 被导入他的方法专门清除了一行,所以如果有人可以让它工作,(再次,我使用 JCreator 编码,我不知道这是否与我的问题) 我可以看到它被循环清除所有行。

有什么方法可以让你不那么讨厌?

回到这个for(int x = 0; x!=100; x++){ System.out.println(); } 有没有办法阻止用户在命令行中向上滚动?将光标设置在提示符的左上角?这将使这种方法更加有用。

另一种理论

有没有办法简单地告诉 java 在一个命令行中停止打印,在另一个命令行中开始打印,然后关闭第一个的窗口,这样它似乎只清除了控制台,而是创建了一个全新的控制台?过去两个小时我一直在思考这个问题,理论上它会起作用,但我不知道这样做的代码是否存在。

【问题讨论】:

  • 总有一个选项可以创建(一个简单的)带有swing的控制台来输出/输入你的程序。
  • @arynaq 是的,我知道,但我希望将它留在控制台中,我喜欢它的外观。
  • 您说的是命令行 Java 应用程序吗?什么平台(Linux、Windows、...)?
  • @ct_ 是的,Windows 7 上 JCreator 中的基本 Java 应用程序

标签: java console console-application


【解决方案1】:

没有一种可靠的方法可以在任何地方都有效。你已经发现了这一点。

通常,命令行输出进入终端回滚缓冲区,其中仅显示最后的n 行,但之前的行可通过滚动机制获得。命令行程序不会直接写入此缓冲区,而是写入stdout,在大多数情况下,通过管道传输到终端进程,然后显示数据。

某些终端程序(即支持 ANSI 转义的程序)可能会让您清除屏幕的可见部分。据我所知,只有 Windows 的 cmd.exe 通过清除整个回滚缓冲区来响应“清除屏幕”请求。在 Linux AFAIK 上,不可能完全丢弃缓冲区。而且,在 Windows 上,cls 不是可执行命令,而是内置的 shell,因此您无法从 Java System.exec() 运行它。

此外,任何命令行程序都可以将其输出重定向到一个文件,而程序不知道它,在这种情况下,“清除屏幕”没有多大意义。

如果您必须拥有这种级别的控制,那么您将不得不使用 Swing、AWT 或 GWT 或其他任何方式编写自己的显示窗口,并在那里管理所有交互。

【讨论】:

  • 你能给我一个他工作的例子,以便我可以编辑它并插入我自己的文本、输入、变量等吗?
  • 对不起,这超出了 SO 的范围。您需要学习足够的 UI 编程才能自己完成。
【解决方案2】:

如果它是一个命令行应用程序并且您运行该应用程序的终端/shell 支持 ANSI 转义码,那么您可以这样做:

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

【讨论】:

  • 您的目标是 Linux、Windows 还是两者兼而有之?
【解决方案3】:

答案取决于天气,您使用的是 Linux 还是 Windows 操作系统。如果您使用的是 linux 并想清除控制台,请尝试:
try {
new ProcessBuilder("/usr/bin/clear").inheritIO().start().waitFor();
} catch(Exception e) {}

如果您使用的是 Windows,请尝试:
try {
new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
} catch(Exception e) {}

你可以用任何你想要的方式处理异常。没关系,因为你不会得到一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2011-02-28
    相关资源
    最近更新 更多