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