2013-03-05 53 views
1

我知道如何使用Java通過替換前一行將終端中的輸出包含在一行中。例如:使用Java替換終端中的兩條線

System.out.print("old line"); 
Thread.sleep(3000); 
System.out.print("\rnew line"); 

但是,如果我有兩行輸出,我想什麼都代替

/* array must have length divisible by 2 */ 
public void doPrinting(String[] array) { 
    for(int i = 0; i < array.length/2; i++) { 
     System.out.println(array[i*2]); 
     System.out.println(array[i*2+1]); 
     Thread.sleep(3000); 
     //I imagine some fancy ascii crypticness shall go here? 
    } 

所以,如果我叫doPrinting(new String[]{"Old1", "Old2", "New1", "New2"}),這應該是什麼樣子,在蘋果終端:

MyName$ java MyClass 
Old1 
Old2 

,然後暫停3秒鐘,然後像

MyName$ java MyClass 
New1 
New2 

我該怎麼做?我在Mac OS上,並通過終端運行我的Java主要方法。理想的答案是添加代碼來修改上述doPrinting方法。


UPDATE:從下一個答案之後,我嘗試這樣做:

String ANSI_CSI = "\\x1b["; 
String[] array = {"old1","old2","new1","new2"}; 
System.out.print("\n\n"); 
for(int i = 0; i < array.length/2; i++) { 
    System.out.print(ANSI_CSI + "2A"); // Up 2 
    System.out.print(ANSI_CSI + "K"); // Clear 
    System.out.println(array[i*2]); 
    System.out.print(ANSI_CSI + "K"); // Clear 
    System.out.println(array[i*2+1]); 
    Thread.sleep(3000); 
} 

但這只是給了我這個輸出終端

MyName$ MyClass 


\x1b[2A\x1b[Kold1 
\x1b[Kold2 
\x1b[2A\x1b[Knew1 
\x1b[Knew2 
+0

如果不瞭解您的環境,這很難回答 - 下面的答案假設爲ANSI,但如果您有不同類型的終端/模擬器/膩子安裝,它可能會或可能不會工作。 – KevinDTimm 2013-03-05 21:10:41

+0

@KevinDTimm根據我的經驗,所有的Linux終端和PuTTY都支持ANSI **,而不是'cmd'。 – Riking 2013-03-05 21:13:07

+1

如果用戶正在使用linux或windows - 這不是任何地方 – KevinDTimm 2013-03-05 21:18:57

回答

3

你會想使用ANSI Escape Codes

在這裏,您可能會對「Move Cursor Up」(CSI-A)和「Erase line」(CSI-K)感興趣。

// outside code 
public static final String ANSI_CSI = "\x1b["; 
// inside code 
System.out.println("First line of text"); 
System.out.println("[ 5/365]"); 
System.out.print(ANSI_CSI + "2A"); // up 2 lines 
System.out.println("Different first line of text"); 
System.out.println("[ 11/365)"); 
System.out.print(ANSI_CSI + "A"); // up line 
System.out.print(ANSI_CSI + "2K"); // erase all of line 
System.out.print(ANSI_CSI + "A"); // up line 
System.out.print(ANSI_CSI + "K"); // erase after cursor 
System.out.println("Line one"); 
System.out.println("[240/365]"); 

如果你想這樣做,在一個循環(System.out已爲簡潔起見省略):

// Init to safe state 
print("\n\n"); 
for (loop conditions here) { 
    print(ANSI_CSI + "2A"); // Up 2 
    print(ANSI_CSI + "K"); // Clear 
    println(text_a);  // Print + newline 
    print(ANSI_CSI + "K"); // Clear 
    println(text_b);  // Print + newline 
    Thread.sleep(3000);  // Wait 
} 

請注意,你將需要使用支持這些終端。查看維基百科文章以獲取更多信息。如果它表示某些代碼在「ANSI.SYS」下具有不同的行爲,則適用於默認的Windows命令提示符。

我對Mac沒有任何經驗,所以您的體驗可能會因不同的終端而有所不同。

大多數備用和UNIX終端(gnome-terminal,PuTTY)更全面地支持這些代碼(請參閱關於xterm完整RGB支持的說明)。

+0

運行我的Java類很抱歉,但ANSI是Java類還是什麼?我在Mac OS上,並通過終端命令「java MyClass」運行我的Java類 – CodeGuy 2013-03-05 21:51:56

+0

而且,您是否可以重構代碼,以採取如何將其包含在問題聲明中的形式。注意循環結構。 – CodeGuy 2013-03-05 22:33:01

+0

哦,derp。對我而言,ANSI是一個包含實用方法的自定義類。 – Riking 2013-03-06 00:06:05