我编写了一个Java程序,它从文件加载数据,我在命令行上显示加载进度,在每n条记录后打印一条消息到屏幕上,如下所示:
$>处理了100条记录。
$>处理了200条记录。
$>处理了300条记录。
$>处理了400条记录。
$>处理了500条记录。
...
但是,我想打印一行,只更新数字,即输出总是如下:
$>处理过的< n>记录。
如何在Java中实现这一点,甚至可能吗?
答案 0 :(得分: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控制台上运行(但比退格方法更易读),但避免处理所有退格字符。如果打印的线条比以前短,则可能需要打印一些额外的空格以清除尾随字符。
答案 1 :(得分:1)
您需要找到一种方法来返回到行的开头并覆盖已在控制台上输出的内容。这个问题已在这里得到解决: