6

私が書いているプログラムのコマンドラインインターフェイスの一部は、複数のプログレスバーの呼び出しです。\r現在、次のようなエスケープシーケンスを使用して、コンソールの1行を更新できます。

System.out.printf("\rProcess is %d%% complete", percentageComplete);

ただし、キャリッジリターンはその行の先頭に戻るだけです。2行(またはより一般的には任意の数の行)に戻って、両方/すべてを更新する方法が必要です。

これを行う方法はありますか?

4

2 に答える 2

5

1 つのライナーまたは「マスター/詳細」のいずれかを実行できるコマンド ライン プログレス バーの小さなプロジェクトを作成しました - https://github.com/tomas-langer/cli/tree/master/cli-progressを参照してください。Windows でも動作します。MS Windows のネイティブ実装で ANSI エスケープ シーケンスを使用します (Chalk + Jansi)。

もっとやりたい場合は、Jansi を使用する Chalk ライブラリ ( https://github.com/tomas-langer/chalk ) を確認してください (以前の投稿で既に説明されています)。

line up と clear line の ansi エスケープ コードは Chalk ライブラリにあります。それらを使用するには:

import com.github.tomaslanger.chalk.Ansi;
...
System.out.print(Ansi.cursorUp(2)); //move cursor up two lines
System.out.print(Ansi.eraseLine()); //erase current line
于 2016-01-03T22:02:48.600 に答える
3

\r残念ながら、カーソルを上に移動するのに相当するものはありません。ただし、これは、ANSI 準拠の端末を使用していると想定できる限り、ANSI エスケープ シーケンスを使用して実行できます。

ANSI コードを使用してプログレス バーを印刷するには、次のようにします。

System.out.printf(((char) 0x1b) + "[1A\r" + "Item 1: %d ", progress1);
System.out.printf(((char) 0x1b) + "[1B\r" + "Item 2: %d ", progress2);

ANSI コードの唯一の問題は、ほとんどすべての端末が ANSI コードを使用しているのに対し、Win32 端末は使用していないことです。私はそれをテストしていませんが、組み込みの Windows ターミナルもサポートする必要がある場合は、このライブラリを調べると良いようです。これには、Windows 端末で同等の処理を行う JNI ライブラリが含まれており、JNI ライブラリと ANSI コードのどちらを使用するかを自動的に決定します。また、ANSI コードを少し使いやすくする方法もいくつかあります。

于 2014-10-14T05:46:40.120 に答える