Java 如何在不阻塞的情况下从控制台接收输入?

Java 如何在不阻塞的情况下从控制台接收输入?,java,console,nonblocking,Java,Console,Nonblocking,注意:我知道控制台是用于调试的,游戏应该使用GUI。这是为了测试/体验 我正在写一个以每秒60帧的速度运行的游戏。每次更新,我都会检查用户是否输入了String命令。如果是,则它被传递,如果不是,null被paas传递,并且null被忽略 扫描器是不可能的,因为用于查看是否有数据要读取的方法hasNext(),可能会阻塞并导致问题 我尝试过使用BufferedReader.ready()。我不仅遇到了问题(从未返回true),而且我还读到由于一些原因不建议使用它 BufferedReader.a

注意:我知道控制台是用于调试的,游戏应该使用GUI。这是为了测试/体验

我正在写一个以每秒60帧的速度运行的游戏。每次更新,我都会检查用户是否输入了
String
命令。如果是,则它被传递,如果不是,
null
被paas传递,并且
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.console()
中的
reader()
,但是
console()
返回空值。我已经阅读了这个主题,我不知道为什么。这不是做这件事的方法

目标是检查流,看看它是否包含要读取的数据,这样我就可以在知道数据不会阻塞的情况下读取数据

我不想使用单独的
线程
来处理用户输入,因此请不要推荐或询问原因


输入必须来自控制台。在此过程中不创建新套接字。我读过一些关于它的话题,但没有一个明确地提出解决方案这可能吗?

正如您自己所说,定制GUI或附加线程是正确的方法。但是,如果没有,您是否尝试过使用
readLine()
例如:
String inputR=System.console().readLine()

对main()的一些修改:

替换:
InputReader读取器=新的InputReader(System.in)带有:
Console c=System.Console()

替换:
game.update(reader.next())
使用:
game.update(c.readLine())


编辑:此线程也可能有帮助:

System.console()
可能返回null,具体取决于JVM的启动方式()。事实上,我发现我的示例在我朋友的计算机上运行。我是在我的手机上运行这个程序的(虽然它支持控制台应用程序,但还不能完全正常工作)。长话短说,这是一个JVM问题,现在我意识到我的问题只适用于一个非常特定的平台,不适合这样做。谢谢你的尝试:)你有没有让它工作过?