这个问题可以更好地改写为:How do you detect EOF in InputStream without blocking
我有一个能够直接从 System.in 获取输入的 java 程序(不使用扫描器),我也可以像任何程序一样直接将输入输入到 java 程序中。但是,当我将输入输入到程序中时,程序会继续运行。这个想法是如果输入被输入到程序中,则停止程序,但如果我们正在等待用户输入,则保持程序运行。
我的问题是如何使用 InputStream 来检测管道何时结束(并结束程序)?如果我使用的是 Scanner,我知道我可以使用Scanner#hasNext()来检测我是否可以阅读更多内容,但是如果可能的话,我想只使用 InputStream 来做到这一点。
我的代码目前看起来与此类似:
final InputStream in = System.in; // sometimes in won't be System.in
final byte[] buffer = new byte[1024];
while(true){
int len;
// the reason I use in.available() is so I only read if in.read() won't block
while(in.available() > 0 && (len = in.read(buffer)) > -1){
String s = new String(buffer, 0, len);
// do something with string
}
// sometimes do other stuff not relevant to this question
}
我愿意接受更简单的解决方案。我不使用 Scanner 对象的原因是因为我需要一次读取单个字符,而不仅仅是一次读取行。这个程序的目的不仅仅是来自用户的输入,大多数时候输入甚至不是来自 System.in,我只是在上面的例子中包含了 System.in,因为它有时是 System.in
编辑:无论出于何种原因,我花了大约 2 个小时的时间在互联网上搜索一个简单的解决方案。我试过只使用 InputStream,甚至将我的代码转换为使用 ReadableByteChannel(使用 Channels.newChannel() 创建)来查看是否可行。我能找到的每个包装 InputStream 的实现都是阻塞的。我想解决这个问题的唯一方法是使用另一个线程。祝未来的观众好运。
哔哔one
慕无忌1623718
慕仙森
相关分类