用 Java 在控制台下输出用 System.out.print()
这样的方法,那么要在同一行输出象 FTP 传文件那样的进度指示怎么做呢,它需要在同一行相同的位置上擦除并输出新百分数。比如前一行打印了 1%, 下一次就把 1% 擦除掉,同一位置上打印 2%,就形成了走进度的效果。如下:
我们要用到的办法是 System.out.print("\b")
就会在控制台下往回删掉一个字符,如果你想回删多个字符就打印多个 "\b" 吧,只回删除到当前行首,也就是不回影响到上一行的输出。怎么删除当前行全部输出或指定的字符数呢,两个办法:
输出足够多的 "\b",会删除到行首为止,这样做其实也不保险,谁知道上一行会多少字符呢
精确控制回删多少个字符,有时候也需要保留前面一些内容
前面动画演示的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void main(String[] args) throws Exception { System.out.print("Progress:"); for (int i = 1; i <= 100; i++) { System.out.print(i + "%"); Thread.sleep(100); for (int j = 0; j <= String.valueOf(i).length(); j++) { System.out.print("\b"); } } System.out.println(); } |
这是打印 "\b" 回删字符的办法,还有一种做法是 System.out.print("\r")
,把光标直接跳到当前行首,然后以覆盖的方式输出字符,这样能保留动态部分后方的内容。但是不知道怎么在控制台下往后跳动光标, Java 好像还做不到这点,.NET 可以,Console.SetCursorPosition(left, right)。
Java 下可以运行下面的代码
1 2 3 |
System.out.print("old line"); Thread.sleep(1000); System.out.print("\rnew\n"); |
执行效果是先输出,old Line,一秒后当前行内容变为 new Line
要我说用 "\b" 来清除当前行,重新输出当前后的内容比较容易控制。
注意,在有些 IDE 的控制台下执行与系统的控制台是不一样,比如在 Eclipse 的控制台下第一段代码会输出
Progress: 1%2%3%4%5%6%7%8%9%10%11%12%13%14%15%.......
也就是 System.out.print("\b"), System.out.print("\r") 对于 Eclipse 控制台是无效果的。
关于如何运用 Java 写出更为强大的控制台程序可以了解以下两个项目:
1. lanterna
本文链接 https://yanbin.blog/java-console-perent-progress/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
foo bar