Java 使用StreamGobbler处理输入

Java 使用StreamGobbler处理输入,java,runtime.exec,outputstream,Java,Runtime.exec,Outputstream,我已经通过StreamGobbler访问了以下URL 我了解它的用法和实施的原因。但是,所涵盖的场景仅限于可能存在来自命令/处理错误的输出的场景 我没有发现任何使用StreamGobbler处理输入的场景。例如,在mailx中,我必须指定电子邮件的正文,这是我用以下格式完成的 Process proc = Runtime.getRuntime().exec(cmd); OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputS

我已经通过StreamGobbler访问了以下URL

我了解它的用法和实施的原因。但是,所涵盖的场景仅限于可能存在来自命令/处理错误的输出的场景

我没有发现任何使用StreamGobbler处理输入的场景。例如,在
mailx
中,我必须指定电子邮件的正文,这是我用以下格式完成的

Process proc = Runtime.getRuntime().exec(cmd);
OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream());
osw.write(mailBody);
osw.close();

如何通过StreamGobbler处理这个问题,或者不需要通过它来处理这个问题。

理想情况下,如果您已经期望在
InputStream
上有什么内容,那么您应该在错误流上使用
StreamGobbler
,以便在
进程运行时进行检查。waitFor()
返回一个非零值以查找错误消息。如果您对
InputStream
不感兴趣,则在完成向命令提供输入后,可以直接在代码中读取错误流

Process proc = Runtime.getRuntime().exec(cmd)
// Start a stream gobbler to read the error stream.
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream());
errorGobbler.start();

OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream())
osw.write(mailBody)
osw.close();

int exitStatus = proc.waitFor();
if (0 != exitStatus) {
    /*
     * If you had not used a StreamGobbler to read the errorStream, you wouldn't have
     * had a chance to know what went wrong with this command execution.
     */
    LOG.warn("Error while sending email: " + errorGobbler.getContent());
}

因此在本例中,我对
mailx
命令的InputStream不感兴趣。但作为故障保护,我应该包括它吗?另外,关于我上面提到的邮件正文,这不是StreamGobbler的一部分,不是作为故障保护,而是为了告知错误(如果有),您应该始终阅读错误流。正如您所说,如果您不希望命令有任何输出,那么inputstream是可选的。不,邮件正文是您对流程的输入。我仍然感到困惑。我的命令看起来像是
mailx-s mymail mailsubject mailtoaddress
,因此当我执行它时,输入流中不会出现任何内容。因此邮件正文与StreamGobbler无关,需要传递给它。我的理解正确吗?如果我错了,请纠正我。您只需将
proc.getOutputStream()
传递给StreamGobbler即可。请查看编辑,了解我将如何使用它。不,不需要。事实上,不应该这样做,因为StreamGobbler用于inputstreams(输入/错误)。