Java-如何终止非阻塞stdin读取循环
以下是我的Java程序(在主线程中)中的一段代码: 程序运行正常。它只是从stdin读取(以非阻塞方式)一些输入,然后将输入写入文件。我使用了“System.in.available()”以便“System.in.read(buffer,0,bytesavable)”语句不会阻塞 但是,我无法通过在键盘上键入“ctrl-D”来终止程序。我只能用“ctrl-C”来结束它,我认为这不是一种优雅的方式。“bytesRead==-1”条件似乎永远都不是真的 我能做的任何修改都可以通过“ctrl-D”终止程序。有什么想法吗,谢谢。基于 您可以使用ByteBuffer从缓冲区读取整数。 然后你可以把这个整数和4比较。如果是,那么它是CTRL+D 如果您看到Aleadam响应,您可以看到如何检查CTRL+D:Java-如何终止非阻塞stdin读取循环,java,io,Java,Io,以下是我的Java程序(在主线程中)中的一段代码: 程序运行正常。它只是从stdin读取(以非阻塞方式)一些输入,然后将输入写入文件。我使用了“System.in.available()”以便“System.in.read(buffer,0,bytesavable)”语句不会阻塞 但是,我无法通过在键盘上键入“ctrl-D”来终止程序。我只能用“ctrl-C”来结束它,我认为这不是一种优雅的方式。“bytesRead==-1”条件似乎永远都不是真的 我能做的任何修改都可以通过“ctrl-D”终止
public class InputTest {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringBuilder out = new StringBuilder();
while (true) {
try {
int c = in.read();
if (c != 4) // ASCII 4 04 EOT (end of transmission) ctrl D, I may be wrong here
out.append (c);
else
break;
} catch (IOException e) {
System.err.println ("Error reading input");
}
}
System.out.println(out.toString());
}
}
如果你看到这个
Jeff Mercado response您可以执行以下操作:
byte[] arr = { 0x00, 0x01 };
ByteBuffer wrapped = ByteBuffer.wrap(arr); // big-endian by default
short num = wrapped.getShort(); // 1
ByteBuffer dbuf = ByteBuffer.allocate(2);
dbuf.putShort(num);
byte[] bytes = dbuf.array(); // { 0, 1 }
试试这段代码。这对我很有用:
try {
while ((bytesAvailable = System.in.read(buffer)) != -1) {
myOutputStream.write(buffer, 0, bytesAvailable);
myOutputStream.flush();
} catch (IOException e) {}
CTRL-D将使终端使缓冲输入可用。如果一行本身没有任何内容,CTRL+D会向System.in InputStream发送一个EOF信号,该信号为-1。System.in.read(缓冲区,0,字节可用);由于签入System.in.available()时有字节可用,因此不阻止。也请检查此项。我想这就是你想要的。@pringi我知道这个解决方案,但我关心的是保持我的while循环处于非阻塞模式。我可能会检查while循环中的其他标志,因此如果while循环在read语句中阻塞,我可能没有机会检查其他标志/条件以做出进一步的决定。我认为主要的一点是,我使用的是
System.in.available()
,它允许我进行非阻塞读取。如果System.in.available()
未给出任何>0结果,则将无法访问System.in.read
语句。但是在键盘上键入ctrl-D似乎不允许System.in.available()
给出任何>0的结果。这就是重点。我知道这种方法。我的观点是我需要使用System.in.available()
,这样while循环就不会阻塞。但是,System.in.available()
在键盘中键入ctrl-D时似乎不会给出任何>0的结果。谢谢,但我需要使用System.in.available()
进行非阻塞读取,这似乎会给通过ctrl-D终止造成麻烦。
try {
while ((bytesAvailable = System.in.read(buffer)) != -1) {
myOutputStream.write(buffer, 0, bytesAvailable);
myOutputStream.flush();
} catch (IOException e) {}