0

Javaで標準入力(用語)をクリアするには?

少しの歴史: 私は「反射」プログラムを書いています。アルゴリズムは非常に単純です:

wait a random amount of time
print "press enter"
read line

ポイントは、ユーザーが誤ってエンターキーを押した場合、それが読み取られるため、テストが間違っていることです。私の目標は、そのバグを修正することです。そのためには、次のようなアルゴリズムが必要です。

wait a random amount of time
clear stdin
print "press enter"
read line

しかし、私はそれを行う方法を見つけることができません。この投稿は興味深いようです:available残りの文字数を取得し、skipそれらをスキップします。紙のみでの作業。Enterキーを複数回押してアプリケーションにストレスをかけると、availableメソッドは戻ります

ブロックせずにこの入力ストリームから読み取る (またはスキップする) ことができる推定バイト数

そのため、戻り値が間違っている場合があり、少なくとも 1 つのキャリッジ リターンがバッファに残り、バグがまだ残っています。

この解決策はうまくいくかもしれませんが、それは私がしたくないプラットフォームに依存しています。さらに、Java からシステム ルーチンを呼び出すことは非常に悪い考えです。

再開するには、プログラムの標準入力をクリアしたいのですが、それを閉じたり、ユーザーが入力するのを待ってプログラムをブロックしたりしたくありません。私には非常に基本的な問題のように思えるので、答えが明白であるとしたら恥ずかしいことです!

4

1 に答える 1

1

「標準入力のクリア」に対する答えがありません。それはOS固有のものであり、試す価値さえないかもしれません。

ただし、問題を解決するには、ランダムな時間にユーザーにプロンプ​​トを表示する java.util.Timer を使用できます。これは別のスレッドで実行されます。ユーザーが最後に Enter キーを押したときに、プロンプトが表示されたかどうかを確認します。

以下のコード例は、5 秒後に "Press enter" を出力します。メイン スレッドはユーザー入力の待機をすぐにブロックします。Enter キーを押すのが早すぎると、ブール値スイッチがまだオンになっていないため、そのように表示されます。

*注: TimerTest は、私がいじったクラスの名前です。あなたのクラス名に自由に変更してください

static boolean userPrompted = false;

public static void main(String[] args) throws IOException {

    // Setup a 5 second timer that prompts the user and switch the userPrompted flag to true
    // This will run in a separate thread
    Timer timer = new Timer(false);
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println("Press enter");
            synchronized(TimerTest.class) {
                userPrompted = true;
            }
        }
    }, 5000);

    // Blocks waiting for user input
    System.out.println("Get ready.. press enter as soon as you're prompted..");
    String input = new BufferedReader(new InputStreamReader(System.in)).readLine();

    // Check if user has been prompted
    synchronized (TimerTest.class) {
        if(!userPrompted) System.out.println("You pressed enter before prompted");
        else System.out.println("You pressed enter after prompted");
    }

}
于 2013-03-27T00:21:13.160 に答える