0

マルチスレッド Java コンソール アプリケーションがあります。スレッドの 1 つはユーザーからの入力を読み取り、他のスレッドはコンソールにデータを出力します。この問題は、ユーザーが入力を入力しているときにライター スレッドが何かを出力すると発生します。ユーザーの邪魔になります。

出力の先頭に「\r」を書き、見栄えを良くするために行をクリアしました。ただし、ユーザーがその瞬間まで入力したものを次の行に出力したい。

たとえば、入力として 123456 を入力します。しかし、123と入力すると、

>123

ライタースレッドは「OUTPUT」を出力します。

>OUTPUT
>

以前に入力したもの ("123") を表示してから、残りの入力を入力します。

>OUTPUT
>123

jLine を使用するように提案されました。しかし、私はそれを達成できませんでした。jLine ライブラリの使用例を提供したり、代替ソリューションを提案したりして、私を助けてくれませんか?

ライター スレッドをブロックしないことが重要です。到着時に出力を印刷する必要があります。

4

1 に答える 1

1

次のようなことをしなければなりません:

private synchronized static void println(ConsoleReader in, String text) throws IOException {
    in.printString("\r");

    in.printString(text + "\n");

    in.redrawLine();
    in.flushConsole();
}

既存のプロンプトとユーザー入力を上書きし、新しい行を追加してから、その下にプロンプ​​トとユーザー入力を再描画します。

次のように使用できます。

public static void main(String[] args) throws IOException {
    ConsoleReader in = new ConsoleReader();
    new Thread() {
        @Override
        public void run() {
            while (true) {
                try {
                    println(in, new Date().toString());
                    Thread.sleep(100);
                } catch (IOException | InterruptedException e) {
                    throw new IllegalStateException(e);
                }
            }
        }

    }.start();
    while (true) {
        in.readLine("> ");
    }
}

これにはいくつかの問題があります。たとえば、長い入力は、追加されたテキストの下から「はみ出します」。バックスペースまたは「\033[2K」エスケープコマンドでクリアできます。

于 2016-08-14T14:38:58.623 に答える