我编写了一个从文件加载数据的 Java 程序,并通过在每 n 条记录后在屏幕上打印一条消息来在命令行上显示加载进度,如下所示:
$> 处理了 100 条记录。
$> 处理了 200 条记录。
$> 处理了 300 条记录。
$> 处理了 400 条记录。
$> 处理了 500 条记录。
...
但是,我想只打印一行,并且只更新数字,即,这样输出总是看起来像这样:
$> 处理了 < n > 条记录。
如何在 Java 中做到这一点,甚至有可能吗?
我编写了一个从文件加载数据的 Java 程序,并通过在每 n 条记录后在屏幕上打印一条消息来在命令行上显示加载进度,如下所示:
$> 处理了 100 条记录。
$> 处理了 200 条记录。
$> 处理了 300 条记录。
$> 处理了 400 条记录。
$> 处理了 500 条记录。
...
但是,我想只打印一行,并且只更新数字,即,这样输出总是看起来像这样:
$> 处理了 < n > 条记录。
如何在 Java 中做到这一点,甚至有可能吗?
这取决于您的控制台,但最简单的方法是使用退格字符将光标向后移动,在最近打印的字符前面:
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 控制台上仍然不起作用(但比退格方法更具可读性),但避免了对所有退格字符的处理。如果打印比以前更短的行,可能需要打印一些额外的空格来清除尾随字符。
您需要找到一种方法来返回到行首并覆盖控制台上已经输出的内容。这个问题已经在这里解决了: