猿问

获取 BufferedReader.readLine() 等待输入

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


www说
浏览 243回答 1
1回答

PIPIONE

如果您希望 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方法什么都不做
随时随地看视频慕课网APP

相关分类

Java
我要回答