5

我编写了一个从文件加载数据的 Java 程序,并通过在每 n 条记录后在屏幕上打印一条消息来在命令行上显示加载进度,如下所示:

$> 处理了 100 条记录。

$> 处理了 200 条记录。

$> 处理了 300 条记录。

$> 处理了 400 条记录。

$> 处理了 500 条记录。

...

但是,我想只打印一行,并且只更新数字,即,这样输出总是看起来像这样:

$> 处理了 < n > 条记录。

如何在 Java 中做到这一点,甚至有可能吗?

4

2 回答 2

5

这取决于您的控制台,但最简单的方法是使用退格字符将光标向后移动,在最近打印的字符前面:

int[] step = {100,200,300,400,500};
System.out.print("$> processed < ");
for (int i : step) {
   System.out.print(i + " > records.\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
   Thread.sleep(500);
}

这适用于 windows 命令行,但例如它不适用于 Eclipse 控制台。

您应该添加一些额外的逻辑来计算打印的字符数,而不是对所有这些“\b”字符进行硬编码,而是根据最近的输出计算正确的数字。

正如@Reza 建议的那样,使用 "\r" 更容易:

int[] step = {100,200,300,400,500};
for (int i : step) {
   System.out.print("$> processed < " + i + " > records.\r");
   Thread.sleep(500);
}

它在 Eclipse 控制台上仍然不起作用(但比退格方法更具可读性),但避免了对所有退格字符的处理。如果打印比以前更短的行,可能需要打印一些额外的空格来清除尾随字符。

于 2013-01-22T12:38:09.437 回答
1

您需要找到一种方法来返回到行首并覆盖控制台上已经输出的内容。这个问题已经在这里解决了:

如何在控制台中返回到行首?

于 2013-01-22T12:41:44.137 回答