2013-07-31 115 views
3

某些程序產生輸出到bash的方式,用戶體驗如字符串改變值而不是行打印(bash向下滾動以顯示所有變化的輸出)。這種現象叫什麼?例如,如何在java程序或bash腳本中實現。輸出如何被解析?它只是打印新的行,但使用一些特殊的功能?Bash非滾動終端輸出

頂部是一個使用該輸出數據


奧基遊標使用的「現象」一個程序。

那麼我怎麼能解析他們在Java?我想這個代碼,但所有好的答案,IM現在這個話題比較熟悉,甚至你我仍然無法解析像在java中頂部的一個程序的輸出沒有打印任何東西

public static void exeTest(String [] args) throws IOException{ 
     if (args.length <= 0) { 
      System.out.println("empty command"); 
      return; 
     } 

     Process process = new ProcessBuilder(args).start(); 
     InputStream is = process.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 


     System.out.printf("Output of running %s is:", 
      Arrays.toString(args)); 
     String line; 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 

感謝。我關閉這個問題,並做更多的關於如何解析這個在java中的研究。然後我可以開始另一個更具體的關於解析java中的輸出。

+1

http://en.wikipedia.org/wiki/Curses_%28programming_library%29 – devnull

+0

諸如'top'等應用程序利用'curses'來實現你所描述的內容。 – devnull

回答

3

,而不是打印整行(如println或打印%n),寫入退格字符(\b)或裸回車換行符沒有(\r)來移動光標在你要打印在什麼前面。

+0

(只是不要在你的IDE中做,它可能不支持它)) – MadProgrammer

+0

這聽起來像一個駭人聽聞的解決方案:/它真的是標準嗎?:S 而不是寫System.out.println(str)我寫str.length生成字符串與x \ b \ b \ b ...然後str,然後使用System.out.print來覆蓋最後一個打印的行?這怎麼能被解析? (line.startswith(\ b))首先刪除... 例如,如何建立一個程序,從上面解析CPU使用情況,並顯示它在一個鞦韆(我不這樣做) –

+2

這是一個hackish解決方案,但這是爲基本命令行程序完成的標準方式。任何更復雜的事情都需要像'curses'這樣的終端庫,這幾乎肯定是矯枉過正的。沒有標準的跨平臺方式來「清除」終端或回到以前的線路。輸出對於屏幕刮取是不實際的。 – chrylis

0

這可以用你說的方式完成,我的意思是打印新的行。想象一下你有循環:

String header = "Current val:"; 
String buffer = ""; 
for(int i = 0; i < val; i++) { 
    buffer = header + " " + i + "\n"; 
    buffer += (val - i) + "iterations left\n"; 
    //add other strings to buffer... 
    //Clear console here 
    //Print buffer 
} 

所以輸出看起來是靜態的,變量的變化。

其他更強大的方法是使用goto(x, y)類似的函數來進行精度輸出操作。 Java在標準api中沒有,但是它有一些庫。 Java gotoxy(x,y) for console applications

+0

//清除控制檯 怎麼樣? 「清除」(命令)?這是如何做頂級程序? –

+0

這就是問題 - 清除控制檯依賴於操作系統。 – MGorgon

0
+0

感謝您的迴應,我現在的主要問題是解析java執行的進程的遊標輸出。當我開始這個過程時,我可以調用getOutputStream,但沒有像獲得遊標那樣的東西 –

1

既然你已經用bash標記了這個問題,我假設你正在運行linux/cygwin。因此,終端很可能與ANSI兼容。在這種情況下,您也可以使用ANSI escape sequences ...

例如:

echo -e "Hello world\rHi" 
# Produces "Hillo world" since the line is not cleared before printing "Hi". 
echo -e "Hello world\r\e[KHi" 
#produces "Hi" (prints "Hello world", goes to 1st column, clears to last column, prints "Hi") 
# For more details, refer above link. 

如果您需要在循環運行(這是最明顯的例子),確保無論是

  1. 你不把換行符消息字符串後,還是
  2. 使用ANSI轉義序列 - 「\ e [A」(或\ n \ n \ n > A「,其中N =行數),您還原垂直光標移動(由於」\ n「)。

備註:

上面給出的代碼是bash命令。對不起,我沒有太多熟悉Java語法,但是據我所知,

  1. 回聲會得到翻譯成System.out.println
  2. 回聲沒有最後的換行符將實現與System.out.printf
  3. & \e<ESC>字符( ascii = 27),可以用java字符串中的\033來實現。