如何在我的Java命令行程序中更改一行的显示内容,而不显示新行?

4
我正在制作一个Java命令行程序。
如何更改已经显示的行的内容?
例如,我可以显示:
状态:0%
状态:2%
...
状态:50%
不过,与其继续推下每个新行,我只需更改现有行的内容,以便在原地更改完成百分比。
我以前见过一些控制台程序这样做,那么我该如何在Java中实现呢?
2个回答

3
在大多数情况下,你可以输出回车符 (\r) 而不是换行符 (\n)。这取决于终端是否支持,大多数终端都支持。 \r 将光标移回到行的开头。
编辑:显然,在执行此操作时,请使用 System.out.print 而不是 System.out.println(或者通常使用你正在使用的输出方法的纯文本形式,而不是带有 ln 后缀的形式),因为 ln 后缀会自动在文本后添加一个换行符。
示例:
for (n = 10000; n < 10010; ++n) {
    System.out.print(String.valueOf(n) + "\r");
}
System.out.println("Done");

当这个过程结束后,你可能会在控制台屏幕上看到这个结果:
Done0

由于“完成”比您之前输出的最长内容要短,因此没有完全覆盖它(因此结尾处有一个0,残留自“10010”)。所以教训是:记录您写的最长内容并用空格覆盖它。


这样做不会将输出附加到先前输出的“print”中吗? - Isharyan
我知道的一些代码使用 \b 来“回退”替换比特,而不是用 \r 替换整行。 - C. K. Young
@Isharyan: \r将光标放置在行的开头(对于大多数终端而言),因此您在其后添加的任何内容都将出现在行的开头。 - C. K. Young
@lsharyan:不好意思,我应该在回答中说出Chris所说的话。我会编辑一下。 - T.J. Crowder
@Chris Jester-Young:如果下一行的物理空间比上一行少,我该如何确保没有任何上一行的残留部分?是添加一堆空格还是其他方法? - Isharyan
@lsharyan:是的,事实上我刚刚在我的编辑中包含了一条关于那个的注释。 - T.J. Crowder

2
请看这个例子

可运行的代码:

public class progress {
    public static void main(String[] args) throws InterruptedException {    
        for (int i = 0; i <= 100; i++) {
            Thread.sleep(30);
            System.out.print("\rSTATUS: "+i+" % " );
        }   
    }
}

提示:要获取更多有关Google - Java控制台进度条的信息。

我想补充一下,JLine非常适合处理这种东西。 - Brian Agnew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接