我有一个从 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始终为空,因此 Java 永远不会退出循环。这很可能表明我对 InputStream 接收“服务器就绪”消息的假设是错误的,但我不知道为什么会这样。我正在寻找一种方法来获取“服务器就绪”消息,或者寻找一种更好的方法来检测服务器何时就绪。任何帮助,将不胜感激。编辑在此之前,我尝试在循环之前初始化 BufferedReader。它有相同的行为。
1 回答
![?](http://img1.sycdn.imooc.com/545863e80001889e02200220-100-100.jpg)
PIPIONE
TA贡献1829条经验 获得超9个赞
如果您希望 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
则此方法将返回空输入流。
应该很明显,但什么是空输入流?
标准输出和标准错误的目的地。默认情况下,子进程将标准输出和标准错误写入管道。Java 代码可以通过
Process.getInputStream()
和返回的输入流访问这些管道Process.getErrorStream()
。但是,标准输出和标准错误可能会使用redirectOutput
和重定向到其他目的地redirectError
。在这种情况下,Process.getInputStream()
和/或Process.getErrorStream()
将返回一个空输入流,为此:
该
read
方法总是返回-1
该
available
方法总是返回0
该
close
方法什么都不做
添加回答
举报
0/150
提交
取消