2013-01-22 24 views
5

我已經編寫了一個Java程序,用於從文件加載數據,並且通過在每n條記錄之後在屏幕上打印一條消息來顯示命令行上的加載進度,像這樣:java顯示在命令行上改變進度

$>處理了100條記錄。

$>處理了200條記錄。

$>處理了300條記錄。

$>處理了400條記錄。

$>處理了500條記錄。

...

不過,我想只是打印一條線,並且只更新數,即,使輸出始終看起來就像這樣:

$>處理< n>記錄。

如何在Java中做到這一點,它甚至有可能嗎?

+0

可能重複的:http://stackoverflow.com/questions/1001335/java-gotoxyx-y-for-console-applications – Andremoniy

回答

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

安德烈亞斯 - 我打印到終端在我的Ubuntu上,它的作用就像一個魅力。謝謝。 – AHL

+0

順便說一句:@Reza發佈的鏈接建議使用「\ r」去行的開始,這可能更容易 - 然後你只需重新打印整行。 –

+0

秒代碼就像一個魅力 – Mohsen

1

您需要找到一種方法來返回到行首並覆蓋已在控制檯上輸出的內容。這個問題已經在此解決:

How can I return to the start of a line in a console?

+0

我嘗試了你所指的方法,它也可以工作。我可以將兩個問題標記爲正確嗎?如果我選擇這個答案,上面的問題就會被忽略。 – AHL

+0

@AHL據我所知,只有一個答案可以被「接受」。請參閱此處:[http://meta.stackexchange.com/questions/40200/can-i-accept-two-answers](http://meta.stackexchange。COM /問題/ 40200 /可以-I-接受,二,答案) – RGO