[英]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.