【问题标题】:Java Process getOutputStream to StringJava 处理 getOutputStream 到字符串
【发布时间】:2015-12-13 06:47:45
【问题描述】:

这里是 Java 8。如何将Process#getOutputStream() 中的数据读入字符串?我正在尝试从 Java 内部运行一个进程并挂钩/捕获它的 STDOUT。

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("consul -v");
String capturedOutput;

OutputStream os = proc.getOutputStream();
capturedOutput = howDoIConvert(os);  // <---- ???

在这里寻找确切的代码(不是像baos.toString(codepage) 这样模糊的东西。如果我需要礼貌地close() 也很感兴趣。

【问题讨论】:

    标签: java stdout outputstream


    【解决方案1】:

    您从 inputStream 中读取数据,而不是从 outputStream 中。

    OutputStream 用于将数据传递给进程。

    Process 有两个基本输入流。一种用于标准输入,可以用getInputStream()检索,另一种用于错误,可以用getErrorStream()检索

    来自getInputStream()的javadoc:

    返回连接到正常输出的输入流 子进程

    来自getErrorStream()

    返回连接到错误输出的输入流 子进程。

    关于流的注意事项:从 java 程序的角度来看,Process 是一个外部程序。当您需要将一些输入添加到您从 java 编写到该程序的外部程序时(因此 java 程序的输出是 Process 的输入)。相反,如果外部程序写了你读它的东西(所以 Process 的输出是 java 程序的输入)。

    Java                   Data direction   External Process
    _____________________________________________________________
    
    write to OutputStream  ------------>    read from InputStream
    read from InputStream  <------------    write to OutputStream
    

    【讨论】:

    • 感谢@David Lorenzo MARINO (+1) - 你似乎是对的,但对我来说,这感觉非常倒退。我从 Java 内部运行的应用程序(在本例中为 Consul)记录到 STDOUT。我会认为 Java Process“包装”Consul 将通过OutputStream 提供STDOUT(这是从Consul out 发送到STDOUT 的字符流)。这是正确的,当我可以在几分钟内给你绿色检查时,我会这样做,但是我对 Java 之神说:诅咒你,哦 Java 之神,你搞错了!!!
    • 我添加了一个注释来解释为什么什么是输入实际上是一个输出,反之亦然
    猜你喜欢
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多