【问题标题】:commands in java to clear the screenjava中清除屏幕的命令
【发布时间】:2011-06-20 18:37:34
【问题描述】:

Java 中的哪个命令可以让您在命令行应用程序中清除控制台?

【问题讨论】:

  • 请澄清。什么画面?控制台?
  • 顺便说一下哪个屏幕?

标签: java command


【解决方案1】:

我认为OP想要的是清除屏幕并将光标移动到主位置。对于该尝试:

        final String ANSI_CLS = "\u001b[2J";
        final String ANSI_HOME = "\u001b[H";
        System.out.print(ANSI_CLS + ANSI_HOME);
        System.out.flush();

【讨论】:

    【解决方案2】:

    这取决于你的控制台,但如果它支持ANSI escape sequences,那么试试这个..

    final static String ESC = "\033[";
    System.out.print(ESC + "2J"); 
    

    【讨论】:

    • 这样的事情可能是你最好的选择,因为我认为没有真正的 Java 解决方案 (+1)
    • System.out 不需要刷新。
    • @wardedmocha:这只适用于 ANSI 终端仿真器。它不适用于普通 Windows 命令提示符。 DOS 曾经有 ANSI.SYS,但在现代 Windows 系统上,它只适用于 DOS(我的意思是实际 20 年前的 DOS,而不仅仅是 CLI)应用程序。
    【解决方案3】:

    运行此示例程序:它演示了如何使用转义序列清除控制台并将光标重新定位到 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);
    • 抱歉,不知道怎么做多行注释。
    • @maan81 遗憾的是,没有办法“存储”和“恢复”System.out。这只是一个流。 Java 的控制台功能非常有限。
    【解决方案4】:

    清除屏幕通常需要发送特殊的控制序列特定于您的应用程序正在运行的屏幕/终端。选项:

    1. 如果您知道您将始终在特定终端下运行,并且可以找到适当的控制序列来清除该终端的屏幕,则只需输出这些序列。如果您告诉我们屏幕,我们或许可以告诉您顺序(它可能有点 ANSI/VT100/VT220 兼容)。

    2. 从外部确保您的应用始终在所需的终端中运行,例如启动应用程序的脚本在所需的终端中启动应用程序。然后输出必要的字符序列来清屏。

    3. 通过使用终端仿真库来控制终端,即您的应用现在是一个窗口应用,它创建一个终端窗口屏幕供用户使用。然后,您可以控制要模拟的终端,并知道需要哪些控制序列。

    4. 使用可检测终端并为其功能提供统一接口的终端库(例如,像历史悠久的 curses 库)。看到这个问题:

      What's a good Java, curses-like, library for terminal applications?

    5. 通过在屏幕上写一堆行来伪造它。

    【讨论】:

      【解决方案5】:

      清除对我有用的 bash:

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

      【讨论】:

        【解决方案6】:

        如果上述解决方案都不适合您(如我的情况),请尝试以下解决方案:

        new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
        

        我使用的是 Windows 8,这个解决方案对我有用。希望它对你也一样。 :)

        【讨论】:

          【解决方案7】:

          总是有明显的(和笨拙的)..

          int numRowsInConsole = 60;
          for (int ii=0; ii<numRowsInConsole; ii++) {
              // scroll down one line
              System.out.println("");
          }
          

          【讨论】:

          • 或者,直接拨打System.out.println()
          【解决方案8】:
          System.out.println("Hello!");
          

          打印指定的字符串,然后将光标移动到下一行。

          System.out.print("Hello!");
          

          打印指定的字符串并在该字符串之后立即离开光标。

          要解决上面提到的光标位于控制台第二行的问题,请使用print 而不是println

          【讨论】:

            【解决方案9】:

            我在 BlueJ 中做了这个并且效果很好:试试 System.out.print("\f");

            【讨论】:

              【解决方案10】:

              据我所知,尽管有传言,Windows 10 的命令行窗口 cmd.exe 本身并不支持 ANSI ESC 序列。拥有:

              final String ANSI_CLS = "\u001b[2J";
              System.out.print(ANSI_CLS);
              

              方法工作你需要一个支持ANSI的命令行模拟器,比如ConEmu64。

              【讨论】:

                【解决方案11】:

                有两种非常简单的方法可以解决这个问题,第一种是蛮力选项:

                for (int i=1; i<=10; i++)
                    System.out.println("\n");
                

                但问题是它只是伪清屏,你可以向上滚动查看数据,但不要害怕,还有另一种方法!

                System.out.println("\f");
                

                瞧!这应该可以解决问题,尽管您的光标将在屏幕被清除后位于控制台的第二行。

                【讨论】:

                • 如果控制台长度大于十行怎么办?
                • 多加几行
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-10-07
                • 2023-03-11
                • 2017-09-15
                • 1970-01-01
                • 2018-07-25
                • 1970-01-01
                相关资源
                最近更新 更多