我怎样才能打印到同一行?

我想打印一个进度条,如下所示:

[# ] 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”以删除行。