我怎样才能打印到同一行?
我想打印一个进度条,如下所示:
[# ] 1% [## ] 10% [########## ] 50%
但是,这些都应该被打印到terminal相同的行而不是一个新的。 我的意思是,每一个新的行应取代以前,这不是使用print()
而是println()
。
我怎样才能在Java中做到这一点?
设置你的string的格式如下
[# ] 1%\r
请注意\r
字符。 这就是所谓的回车 ,将光标移回到行首。
最后,确保你使用
System.out.print()
并不是
System.out.println()
在Linux中,控制terminal有不同的转义序列。 例如,擦除整行有一个特殊的转义序列: \33[2K
和将光标移到上一行: \33[1A
。 所以你所需要的就是每当你需要刷新行时就打印出来。 这里是打印Line 1 (second variant)
的代码:
System.out.println("Line 1 (first variant)"); System.out.print("\33[1A\33[2K"); System.out.println("Line 1 (second variant)");
有光标导航,清除屏幕等代码。
我认为有一些库可以帮助它( ncurses
?)。
首先,我想道歉提出这个问题,但我觉得可以使用另一个答案。
德里克·舒尔茨是正确的。 '\ b'字符将打印光标向后移动一个字符,使您可以覆盖在那里打印的字符(它不会删除整行或甚至是那里的字符,除非在上面打印新的信息)。 下面是一个使用Java的进度条的例子,虽然它不符合你的格式,但是它展示了如何解决覆盖字符的核心问题(这只在Ubuntu 12.04中用Oracle的Java 7在32位机器上testing过,但它应该可以在所有Java系统上运行):
public class BackSpaceCharacterTest { // the exception comes from the use of accessing the main thread public static void main(String[] args) throws InterruptedException { /* Notice the user of print as opposed to println: the '\b' char cannot go over the new line char. */ System.out.print("Start[ ]"); System.out.flush(); // the flush method prints it to the screen // 11 '\b' chars: 1 for the ']', the rest are for the spaces System.out.print("\b\b\b\b\b\b\b\b\b\b\b"); System.out.flush(); Thread.sleep(500); // just to make it easy to see the changes for(int i = 0; i < 10; i++) { System.out.print("."); //overwrites a space System.out.flush(); Thread.sleep(100); } System.out.print("] Done\n"); //overwrites the ']' + adds chars System.out.flush(); } }
在打印更新的进度条之前,可以根据需要多次打印退格字符“\ b”以删除行。