首页 > 解决方案 > 在java中擦除以前的输出行

问题描述

我一直在制作一个终端风格的东西,但我仍然遇到的唯一问题(到目前为止)是加载屏幕。我只是想添加它需要加载的错觉,没什么太复杂的。我需要删除之前的输出行,这样它就会像加载屏幕一样加载。我在这里查看了很多 Q/As,但我尝试的一切都没有帮助我总是得到随机文本,或者文本不在它应该在的位置,或者它根本不起作用。我正在使用 Bluej。

当前代码:

public static void main(String [] args){
    try{
        System.out.println("▒█▀▀▀█ █▀▀█ █▀▀█ █▀▀█ ▀▀█▀▀ █▀▀█ █▀▀▄");
        Thread.sleep(1000);
        System.out.println("░▀▀▀▄▄ █░░█ █▄▄█ █▄▄▀ ░░█░░ █▄▄█ █░░█");
        Thread.sleep(1000);
        System.out.println("▒█▄▄▄█ █▀▀▀ ▀░░▀ ▀░▀▀ ░░▀░░ ▀░░▀ ▀░░▀");
        Thread.sleep(1000);
        System.out.println("o()xxxxxx[{:::::::::::::::::::::::::::::::>");
            Thread.sleep(1000);
            
            System.out.println("Loading... 0%");
            Thread.sleep(2000);
            //Code goes here
            System.out.println("Loading... 13%");
            Thread.sleep(2000);
            //Code goes here
            System.out.println("Loading... 42%");
            Thread.sleep(2000);
            //Code goes here
            System.out.println("Loading... 74%");
            Thread.sleep(4000);
            //Code goes here
            System.out.println("Loading... 92%");
            Thread.sleep(1000);
            //Code goes here
            System.out.println("Loading... 100%");
    }
    catch (InterruptedException e) {
        System.err.format("IOException: %s%n", e);
    }
}

我想发布完整的输出,但艺术不会与此混合,所以这就是它所说的,减去艺术:

斯巴达人

加载中... 0%

加载中... 13%

加载中... 42%

加载中... 74%

加载中... 92%

加载中... 100%

它不应该显示几个“正在加载...”

在合理范围内,我愿意接受任何建议。

标签: javabluej

解决方案


这应该可以解决问题:

public static void main(String [] args){
    try{
        System.out.println("▒█▀▀▀█ █▀▀█ █▀▀█ █▀▀█ ▀▀█▀▀ █▀▀█ █▀▀▄");
        Thread.sleep(1000);
        System.out.println("░▀▀▀▄▄ █░░█ █▄▄█ █▄▄▀ ░░█░░ █▄▄█ █░░█");
        Thread.sleep(1000);
        System.out.println("▒█▄▄▄█ █▀▀▀ ▀░░▀ ▀░▀▀ ░░▀░░ ▀░░▀ ▀░░▀");
        Thread.sleep(1000);
        System.out.println("o()xxxxxx[{:::::::::::::::::::::::::::::::>");
            Thread.sleep(1000);
            
            System.out.print("Loading... 0%xxxxxxxx");
            Thread.sleep(2000);
            //Code goes here
            System.out.print("\033[2K");
            System.out.print("\rLoading... 13%");
            Thread.sleep(2000);
            //Code goes here
            System.out.print("\033[2K");
            System.out.print("\rLoading... 42%");
            Thread.sleep(2000);
            //Code goes here
            System.out.print("\033[2K");
            System.out.print("\rLoading... 74%");
            Thread.sleep(4000);
            //Code goes here
            System.out.print("\033[2K");
            System.out.print("\rLoading... 92%");
            Thread.sleep(1000);
            //Code goes here
            System.out.print("\033[2K");
            System.out.print("\rLoading... 100%");
    }
    catch (InterruptedException e) {
        System.err.format("IOException: %s%n", e);
    }
}

"\033[2K" 删除当前行,"\r" 将光标带回行首并覆盖已写入的内容。

您也可以只使用“\r”,但它会有以下行为:

System.out.print("Loading... 0%xxxx");
System.out.print("\rLoading... 13%");

结果输出将是Loading... 13%xxx因为第二个打印语句没有清除整行 - 它只是覆盖了已经存在的内容!


推荐阅读