簡體   English   中英

如何從控制台接收輸入而不會阻塞?

[英]How would I receive input from console without blocking?

注意:我了解控制台是用於調試的,游戲應使用GUI。 這是為了測試/體驗

我正在寫一個以60fps運行的游戲。 每次更新時,我都會檢查用戶是否輸入了String命令。 如果是這樣,它將通過,但如果不是,則通過paas傳遞null ,並將忽略null

掃描儀是不可能的,因為hasNext()這個用於查看是否有數據要讀取的方法可能會阻塞並導致問題。

我已經嘗試使用BufferedReader.ready() 我不僅遇到了問題(從來沒有返回true ),而且我讀到出於某些原因不建議這樣做。

BufferedReader.available()始終返回0,這在文檔中指出,除非重寫,否則InputStream.available()將始終返回0。 這是我的嘗試:

class Game {

     public static void main(String[] args) {
          InputReader reader = new InputReader(System.in);
          int timePerLoop = 1000/30;

          Game game = new Game();
          while(true) {
               long start = System.nanoTime();
               game.update(reader.next());
               long end = System.nanoTime();

               long sleepTime = timePerLoop + ((start - end) / 10000000);
               if(sleepTime > 0)
                    try {
                         Thread.sleep(sleepTime);
                    }catch(InterruptedException e) {
                         e.printStackTrace();
                    }
               else
                    Thread.yield();
          }
     }

     public void update(String command) {
          if(commands != null) {
               //handle command
          }

          //update game
     }
}

InputReader.java

public class InputReader {
     private InputStream in;

     public InputReader(InputStream stream) {
          in = stream;
     }

     public String next() {
          String input = null;
          try {
               while(in.available > 0) {
                    if(input == null)
                         input = "";

                    input += (char) in.read();
               }
          }catch(IOException e) {
               e.printStackTrace();
          }
          return input;
     }
}

InputStream本身具有與上述相同的問題。 我不完全確定System.in存儲的對象的類型,但是使用available()產生相同的結果。

我試過使用System.console()reader() System.console() ,但console()返回null。 我已經讀過這個主題,所以我不感到困惑。 這不是這樣做的方法。

目的是檢查流以查看其是否包含要讀取的數據,因此我可以在不阻塞的情況下讀取數據。

我不想使用單獨的Thread來處理用戶輸入,因此請不要推薦或詢問原因。

輸入必須來自控制台。 在此過程中不會創建新的套接字。 我已經閱讀了一些有關它的主題,但是沒有一個主題明確提出解決方案。 這可能嗎?

就像您自己說的那樣,自定義GUI或其他線程是執行此操作的正確方法。 但是,如果沒有這種方法,您是否嘗試過使用readLine()例如: String inputR = System.console().readLine();

對main()的一些更改:

替換: InputReader reader = new InputReader(System.in); 使用: Console c = System.console();

替換為: game.update(reader.next()); 使用: game.update(c.readLine());

編輯:此線程也可能有幫助: Java:如何從System.console()獲取輸入

暫無
暫無

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

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