我有一个以Java ProcessBuilder线程开头的Python服务器。 Java程序应等待服务器准备就绪后再继续。服务器准备就绪后,它将输出“服务器就绪”消息,我假设该消息已由Process对象的InputStream接收。
START_SERVER_COMMAND = TAGGERFLOW_HOME + "server.py";
server = new ProcessBuilder().inheritIO().command("python", START_SERVER_COMMAND, "" + portNum,
config.featOrderName(), config.childOrderName(), "" + maxBeta).start();
System.out.println("Hypertagger server started");
LOGGER.log(Level.INFO, "Hypertagger server started");
String line = null;
while(line == null) {
line = new BufferedReader(new InputStreamReader(server.getInputStream())).readLine();
if(line == null)
Thread.sleep(5000);
}
System.out.println("Exit loop");
但是,line
始终为null,因此Java从不退出循环。这很可能表明我对InputStream接收“服务器就绪”消息的假设是错误的,但是我不知道为什么会这样。
我正在寻找一种方式来获取“服务器就绪”消息,或者一种更好的方法来检测服务器何时就绪。任何帮助将不胜感激。
编辑
在此之前,我尝试在循环之前初始化BufferedReader。它具有相同的行为。
答案 0 :(得分:2)
TL; DR:如果您希望Java程序捕获输出,则不要将输出重定向到其他地方,即不要调用inheritIO()
,尽管您可能想调用redirectErrorStream(true)
。
您认为inheritIO()
做什么?
将子流程标准I / O的源和目标设置为与当前Java流程相同。
这是一种方便的方法。表格的调用
pb.inheritIO()
行为与调用完全相同
pb.redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT)
I / O重定向后,您认为getInputStream()
会做什么?
返回连接到子流程正常输出的输入流。该流从此
Process
对象表示的流程的标准输出中获取通过管道传输的数据。如果已使用
ProcessBuilder.redirectOutput
重定向了子流程的标准输出,则此方法将返回null input stream 。
应该很明显,但是什么是空输入流?
标准输出和标准错误的目标。默认情况下,子进程将标准输出和标准错误写入管道。 Java代码可以通过
Process.getInputStream()
和Process.getErrorStream()
返回的输入流访问这些管道。但是,可以使用redirectOutput
和redirectError
将标准输出和标准错误重定向到其他目的地。在这种情况下,Process.getInputStream()
和/或Process.getErrorStream()
将返回空输入流,为此:
read
方法始终返回-1
available
方法始终返回0
close
方法不起作用