2011-10-29 12 views
50

は、私はそうのようなプログレスバーを印刷したい:同じ行に印刷するにはどうしたらいいですか?

[#     ] 1% 
[##     ] 10% 
[##########   ] 50% 

しかし、これらはすべての端末の代わりに、新しい1の同じ行に印刷されなければなりません。 つまり、新しい行はそれぞれ前の行に置き換えてください。println()の代わりにを使用することではありません。

どうすればJavaで実行できますか?

答えて

72

フォーマットあなたの文字列:

[#     ] 1%\r 

\r文字。いわゆるキャリッジリターンで、カーソルをラインの先頭に戻します。

最後に、あなたは、Linuxで

System.out.print() 

なく

System.out.println() 
+13

2004年に報告された[古いバグ](https://bugs.eclipse.org/bugs/show_bug.cgi?id=76936)のため、キャリッジリターンのエスケープシーケンス '\ r'はEclipseでは動作しません。 Eclipseの最後のバージョン(4.3.2 Kepler) –

+0

これは1行でしか動かないのですか? –

+0

@Sortofabeginner:言い換えれば、はい。 – NPE

2

更新された進行状況バーを印刷する前に、バックスペース文字「\ b」を必要なだけ削除して、行を削除することができます。そのような

+2

それは前の行を削除しません、単に一つの文字のバックカーソルを移動します。 – Amndeep7

13

を使用することを確認し、制御端子に別のエスケープシーケンスがあります。たとえば、全体の行を消去する特別なエスケープシーケンスがあります:\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?)。

+2

私はあなたのためにこのタスクを自動化するための2つのユーティリティクラスを作成しました。それらには出力を色づけすることも含まれています:http://bitbucket.org/dainkaplan/tempura-utils –

10

まず、私はこの質問をバックアップすることをお詫びしたいと思いますが、別の回答を使用できると感じました。

デレクシュルツは正しいです。 '\ b'文字は印刷カーソルを1文字後ろに移動させ、そこに印字された文字を上書きすることができます(上に新しい情報を印字しない限り、行全体や削除された文字は削除されません)。以下は、あなたのフォーマットに従わないが、Javaを使用するプログレスバーの例です。これは、文字の上書きの中核的な問題を解決する方法を示しています(これは、Ubuntu 12.04で32ビットマシン上でOracle Java 7でテストされ、しかし、それはすべての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(); 
    } 
} 
0
package org.surthi.tutorial.concurrency; 

public class IncrementalPrintingSystem { 
    public static void main(String...args) { 
     new Thread(()-> { 
      int i = 0; 
      while(i++ < 100) { 
       System.out.print("["); 
       int j=0; 
       while(j++<i){ 
        System.out.print("#"); 
       } 
       while(j++<100){ 
        System.out.print(" "); 
       } 
       System.out.print("] : "+ i+"%"); 
       try { 
        Thread.sleep(1000l); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.print("\r"); 
      } 
     }).start(); 
    } 
} 
関連する問題