【问题标题】:Clear screen with Windows "cls" command in Java console application在 Java 控制台应用程序中使用 Windows“cls”命令清除屏幕
【发布时间】:2013-10-15 15:48:57
【问题描述】:

我正在开发一款游戏,该游戏涉及在每次转弯后清除屏幕以提高可读性。唯一的问题是我不能使用基于 Windows 命令提示符的“cls”命令,而且它不支持 ANSI 转义字符。我在下一页使用了 Dyndrilliac 的解决方案,但它导致了 IOException:

Java: Clear the console

用“cmd \C cls”替换“cls”只会打开一个新的命令提示符,清除它,然后关闭它,而不访问当前控制台。如何使通过 Windows 命令提示符运行的 Java 程序访问命令提示符的参数并使用它们来清除其输出?

【问题讨论】:

  • 在 C 中,system("cls"); 为我工作。但是当我尝试 Java 解决方案时,我也会遇到异常;我认为原因是没有名为cls.exe 的可执行文件。所以这意味着system() 一定在做一些特别的事情,但我不知道是什么。可能需要深入研究 C 库源代码才能弄清楚它是如何工作的。
  • 顺便说一句,我不明白你为什么要提到“命令提示符的参数”。这与清除控制台有何关系?
  • @ajb CLS 实际上是一个 Windows 命令提示符参数,而不是它自己的进程。它旨在在使用时清除 Windows 控制台,但不执行任何特定程序。因此,执行 "Runtime.getRuntime().exec("cls") 实际上会尝试执行一个名为 "cls" 的程序,而不是将参数发送到控制台。
  • "cls" 是 Windows 命令提示符 command,而不是参数。参数是您提供给命令或程序的额外信息;如果你运行java JavaProgram file1 file2,那么file1file2 是参数(并且将是主程序作为参数获取的String[])。术语上的错误让我很困惑。
  • 仍然会发生错误,因为它在您使用 Runtime.getRuntime().exec("cls") 时尝试运行进程。

标签: java console command-line-arguments windows-console


【解决方案1】:

在控制台相关的 API 中几乎没有什么可以做一个清晰的屏幕。但是,您可以通过println()s 实现相同的效果。很多 putty 客户端都是这样清除页面然后向上滚动的。

private static final int PAGE_SIZE = 25;

public static void main(String[] args) {
    // ...
    clearScreen();
}

private static void clearScreen() {
    for (int i = 0; i < PAGE_SIZE; i++) {
        System.out.println();
    }
}

【讨论】:

  • 我知道这行得通,但问题是我希望光标在清除后位于控制台顶部。 “cls”命令适用于 Python,我找到了其他解决方案,但它们不适用于我的计算机。我只需要在当前运行应用程序的 Windows 控制台中使用参数。
【解决方案2】:

创建一个批处理文件以清除 cmd 屏幕并运行您的 java 程序

步骤 1. 创建一个扩展名为 .bat 的文件 第 2 步。所以你在批处理文件中的代码将是

分类 cd 桌面 // 路径 Javac filename.java // 编译 Java 桌面 // 正在运行

通过这样做....您可以在运行时清除屏幕

【讨论】:

  • 那究竟是做什么的,所以我可以正确实现它?换句话说,每个部分是什么意思,我如何在我的程序中使用它?
  • 所以当你使用 cmd 运行该文件....它将清除控制台屏幕并同时运行 java 程序
  • 你为什么要创建一个批处理脚本来清除屏幕?这似乎完全没有必要。
【解决方案3】:
new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();

在这里解决:Java: Clear the console

我意识到这是一篇旧帖子,但我讨厌当我发现问题的答案时,我没关系,我明白了,或者它就死了。希望它能像对我一样帮助别人。

请记住,它在 Eclipse 中不起作用,但在常规控制台中会起作用。如果您担心跨操作系统,请更进一步:

        final String os = System.getProperty("os.name");
        if (os.contains("Windows"))
            new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
        else
            Runtime.getRuntime().exec("clear");

【讨论】:

  • 我想假设使用它需要将它包装在一个方法中,对吗?
  • 我很高兴这对你有用。不需要包装类,我把它自己扔进了一个子类中。请记住,它在 Eclipse 控制台中不起作用。它可以在命令提示符下工作。 Eclipse 无法识别任何清除屏幕的内容。他们说这与应用程序安全有关。有人说它已在火星上修复,但我无法让它工作。
  • 在 NetBeans 8 控制台中不起作用,但在 Windows 7 的 DOS 提示符中运行良好。
【解决方案4】:
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) {}
}

【讨论】:

  • 当问题说cmd /c cls 不起作用时,为什么这会起作用?
  • 我添加了 System.getProperty("os.name").contains("Windows") 和 inheritIO().start().waitFor();所以现在它可以完美运行了。我已经在我自己的 Windows 操作系统中尝试过,它可以完美运行!
  • 您应该在答案中添加该解释。
  • 对不起,堆栈溢出! :)
猜你喜欢
  • 1970-01-01
  • 2012-02-07
  • 2016-08-29
  • 2014-04-10
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2019-01-26
相关资源
最近更新 更多