获取BufferedReader.readLine()以等待输入

时间:2018-08-13 01:31:13

标签: java process bufferedreader processbuilder

我有一个以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。它具有相同的行为。

1 个答案:

答案 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()返回的输入流访问这些管道。但是,可以使用redirectOutputredirectError将标准输出和标准错误重定向到其他目的地。在这种情况下,Process.getInputStream()和/或Process.getErrorStream()将返回空输入流,为此:

     
      
  • read方法始终返回-1
  •   
  • available方法始终返回0
  •   
  • close方法不起作用
  •