Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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
如果我不关闭流,与exe通信后会阻止java println_Java_Stream_Exe_Communication_Println - Fatal编程技术网

如果我不关闭流,与exe通信后会阻止java println

如果我不关闭流,与exe通信后会阻止java println,java,stream,exe,communication,println,Java,Stream,Exe,Communication,Println,我目前正在将GUI连接到UCI国际象棋引擎。为此,我使用以下方法创建引擎流程: try { process = Runtime.getRuntime().exec(enginePath); } catch (IOException e) { System.err.println("ENGINE NOT FOUND"); e.printStackTrace(); } 我确信我能打开引擎 当发动机打开时,没有从发动机输出的有效流。为了启动通信,我必须向引擎发送特定命令。引擎将响应

我目前正在将GUI连接到UCI国际象棋引擎。为此,我使用以下方法创建引擎流程:

try {
   process = Runtime.getRuntime().exec(enginePath);
} catch (IOException e) {
   System.err.println("ENGINE NOT FOUND");
   e.printStackTrace();
}
我确信我能打开引擎

当发动机打开时,没有从发动机输出的有效流。为了启动通信,我必须向引擎发送特定命令。引擎将响应然后。。。因此,它是以命令/响应方式工作的,在打开时不会立即流式传输数据,或者在没有人说话的情况下说话。为了通信,我有一个发送消息块。在此块中,使用其outputstream向引擎写入消息,并使用其standart输入流获取输入,如以下发送方法所示:

    private String sendCommand(String command) {
    stdin = new PrintWriter(new OutputStreamWriter(process.getOutputStream()));
    BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    BufferedReader errReader = new BufferedReader(newInputStreamReader(process.getErrorStream()));
    String answer = "";

    stdin.println(command);
    stdin.flush();
    stdin.close();
    try {   
        String line = "";

        while ((line = inputReader.readLine()) != null) {
            System.out.println(line);
            answer = line;
        }

        inputReader.close();
    } catch (IOException ioe) {
        System.err.println("READ ERROR");
        ioe.printStackTrace();
    }   

    try {   
        String line = "";
        while ((line = errReader.readLine()) != null) {
            System.err.println(line);
        }
        errReader.close();
    } catch (IOException ioe) {
        System.err.println("READ ERROR");
        ioe.printStackTrace();
    }   

    return answer;
}
顺便说一句,整个引擎在一个单独的线程中工作,而不是在主GUI线程中。因此,GUI没有重载。但是,我没有在单个线程中分离stdin stderr和output方法,因为我假设只有stdin和我将写入引擎的stdin。目前我认为它们不会碰撞

通过这些代码,我能够与发动机通信,并且可以在控制台中看到输出。但是由于标准关闭;在出现流关闭错误时,我只能在几秒钟内使用此方法一次。国际象棋引擎需要在打开时以命令/响应方式进行多次通信,每次都不重新启动exe。问题是,如果我删除该行:stdin.close;是,通信继续,但我的控制台被此通信阻止。也就是说,我不能再出于调试目的将LN打印到控制台。这非常关键,因为我的主要调试工具是system.out.println。如果我不删除标准,请关闭;我必须重新启动可执行文件,每次我想发送消息,我不希望这样**奇怪的是,由于System.out.printlnline,我可以在控制台中看到来自引擎的消息;发送方法中的行;但是,一旦代码退出该方法,我就无法在控制台上打印任何内容**

编辑:实际上在该块之后:

while ((line = inputReader.readLine()) != null) {
    System.out.println(line);   
    answer = line;
}
System.out.println开始不工作

编辑:问题似乎不在于println,而在于while循环之后的任何语句

根据这一点,似乎因为流从未关闭,而循环被卡住了。实际上,当在while循环内部打印时,在流结束后的某个点,打印停止,这必须指示while循环结束。因此,如果它完成了,它应该在下一个语句中继续,不是吗?无论如何,来自引擎的消息在每个流的末尾都有一组字符串;因此,当我遇到其中一个,我打破了while循环


注:有趣的是:将数据累积为:receivedString+=行;不起作用,即数据未累积。为了修复它,我幸运地使它receivedString=receivedString+line+\n;而且成功了。。我不知道为什么。

您正在读取输入,直到流结束,所以它不会停止读取,直到流结束。在这种情况下,流结束意味着对等方已关闭连接。在流程退出之前,流程的输出或错误流不会发生这种情况。您必须找到其他一些循环终止条件,或者在单独的线程中使用stdout和stderr