我正在编写的程序的命令行界面的一部分调用了多个进度条。\r
我目前可以通过使用类似于以下内容的转义序列来更新控制台中的一行:
System.out.printf("\rProcess is %d%% complete", percentageComplete);
但是,回车仅返回到该行的开头。我想要一种返回两行(或更一般地说,任意数量的行)并让它们都/全部更新的方法。
有没有办法做到这一点?
我正在编写的程序的命令行界面的一部分调用了多个进度条。\r
我目前可以通过使用类似于以下内容的转义序列来更新控制台中的一行:
System.out.printf("\rProcess is %d%% complete", percentageComplete);
但是,回车仅返回到该行的开头。我想要一种返回两行(或更一般地说,任意数量的行)并让它们都/全部更新的方法。
有没有办法做到这一点?
我已经为命令行进度条编写了一个小项目,它可以做一个衬里或“主/细节” - 请参阅https://github.com/tomas-langer/cli/tree/master/cli-progress。它也适用于 Windows - 使用 ANSI 转义序列和 MS Windows 的本机实现(Chalk + Jansi)
如果您想做更多事情,请查看 Chalk 库 ( https://github.com/tomas-langer/chalk ),该库又使用 Jansi(在之前的帖子中已经提到)。
line up 和 clear line 的 ansi 转义码在 Chalk 库中。要使用它们:
import com.github.tomaslanger.chalk.Ansi;
...
System.out.print(Ansi.cursorUp(2)); //move cursor up two lines
System.out.print(Ansi.eraseLine()); //erase current line
不幸的是,没有相当于\r
向上移动光标的方法。但是,这可以通过 ANSI 转义序列来完成,只要您可以假设您在符合 ANSI 的终端上。
要使用 ANSI 代码打印进度条,您可以这样做
System.out.printf(((char) 0x1b) + "[1A\r" + "Item 1: %d ", progress1);
System.out.printf(((char) 0x1b) + "[1B\r" + "Item 2: %d ", progress2);
ANSI 代码的唯一问题是,虽然几乎所有终端都使用 ANSI 代码,但 Win32 终端却没有。我还没有测试过它,但是如果你也需要支持内置的 Windows 终端,这个库看起来会是一件好事。它包括一个 JNI 库,它将在 Windows 终端上执行相同的操作,并自动决定是使用 JNI 库还是使用 ANSI 代码。它还有一些方法可以使 ANSI 代码更易于使用。