簡體   English   中英

使用 `Thread.sleep()` 時如何忽略來自 `BufferedReader` 的輸入?

[英]How to ignore input from `BufferedReader` when using `Thread.sleep()`?

我正在嘗試制作一個在用戶輸入(3...、2...、1...、Go.)之間開始的簡單計數器。

try (var reader = new BufferedReader(new InputStreamReader(System.in))) {
    ...
    try {
        for (int i = 0; i < 3; i++) {
            System.out.println(i + "...");
            Thread.sleep(500);
        }
        System.out.println("Go!");
    } catch (Exception e) {
        e.printStackTrace();
    }
    ...
}

問題是我仍然能夠在延遲之間按鍵,然后打印出來。 有沒有辦法在for-each工作時阻止BufferedReader

你不能阻止用戶在他應該等待的時候按鍵。 出於同樣的原因,您不能阻止您的應用程序通過 System.in 接收這些字符,直到 BufferedReader。 阻止那是錯誤的做法。

但是,您可以做的是忽略這些按鍵。 但是您必須防止它們保留在輸入緩沖區中並在循環后得到評估。

但是,由於您是從標准輸入讀取的,因此打印字符不是您的程序。 我猜這是您在運行基於控制台的應用程序時使用的終端仿真器。 因此我不確定如何防止回顯到控制台。 破壞我假設的是https://forums.codeguru.com/showthread.php?466009-Reading-from-stdin-(without-echo)

證明我錯了(因此你應該嘗試的)是如何使用掃描儀從 Java 中的 STDIN 靜默讀取? 或更一般的 https://www.geeksforgeeks.org/ways-to-read-input-from-console-in-java/

兩者都建議通過讀取 System.console() 來抑制回聲。

您的問題與 BufferedReader 無關,解決方案可能比您想象的更復雜。

當您運行 Java 進程時,它通常連接到一個終端。 這個終端(或模擬器)處理你的鍵盤,通常將你的輸入逐行提供給附加的進程。 終端還會在您鍵入時回顯字符。 這意味着 Java 進程不會打印您鍵入的字符,因此您無法阻止它們從您的進程中打印出來。

終端和終端控制是高度平台特定的。 在 Linux 系統上,您可以使用termios控制終端。 您想要禁用的標志是 ECHO 用於回顯您的擊鍵和 ICANON 用於禁用規范模式,以便您在輸入可用時立即接收。 您必須在循環之前執行此操作。 在循環之后或循環中,您必須使用任何輸入並丟棄它,再次啟用 ECHO 和 ICANON。 請注意,BufferedReader 可能已經緩沖了某些內容並且正在執行阻塞 I/O。

然而,termios 不能直接從 Java 訪問,調用必須通過 JNI fi 進行包裝 谷歌快速搜索得出一個名為purejavacomm的庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM