为了账号安全,请及时绑定邮箱和手机立即绑定

获取 BufferedReader.readLine() 等待输入

获取 BufferedReader.readLine() 等待输入

www说 2021-06-29 13:57:16
我有一个从 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 回答

?
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方法什么都不做


查看完整回答
反对 回复 2021-07-14
  • 1 回答
  • 0 关注
  • 242 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信