Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何终止非阻塞stdin读取循环_Java_Io - Fatal编程技术网

Java-如何终止非阻塞stdin读取循环

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”终止

以下是我的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:

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) {}