将运行时 exec() OutputStream 打印到控制台

新手上路,请多包涵

我正在尝试 OutputStream Process 启动的 exec() 获取到控制台。如何才能做到这一点?

这是一些不完整的代码:

 import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.Reader;

public class RuntimeTests
{
    public static void main(String[] args)
    {
        File path = new File("C:\\Dir\\Dir2");
        String command = "cmd /c dir";
        Reader rdr = null;
        PrintStream prtStrm = System.out;
        try
        {
            Runtime terminal = Runtime.getRuntime();

            OutputStream rtm = terminal.exec(command, null, path).getOutputStream();
            prtStrm = new PrintStream(rtm);
            prtStrm.println();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

原文由 TheWolf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

请参阅 Benjamin Gruenbaum 对自 Java 7 以来可用的 ProcessBuilder API 的回答。

您需要启动一个新线程来读取 Process.waitFor() 之后发生的进程输出。然后可以从该线程将进程输出复制到控制台。

Process.getOutputStream() 实际上是输入,即进程的标准输入。 Process.getInputStream()Process.getErrorStream() 返回 InputStream 对象,它们是进程的标准输出和标准错误。 InputStream s和 OutputStream 是从调用者的角度,与进程的角度相反。

进程的输出 stdout 是调用者的输入,因此调用者得到一个 getInputStream() 并从中读取 stdout:

 Process proc = Runtime.getRuntime().exec(cmdArr, env, cwdir);

InputStreamReader isr = new InputStreamReader(proc.getInputStream());
BufferedReader rdr = new BufferedReader(isr);
while((line = rdr.readLine()) != null) {
  System.out.println(line);
}

isr = new InputStreamReader(proc.getErrorStream());
rdr = new BufferedReader(isr);
while((line = rdr.readLine()) != null) {
  System.out.println(line);
}
rc = proc.waitFor();  // Wait for the process to complete

Process.getOutputStream() 用于调用者将数据“输出”到进程的标准输入中。可以在上面示例的第一行中创建“proc”之后添加此代码,以将数据发送到进程的标准输入中:

 // Send data to stdin of the process (in development, needs input content)
OutputStream os = proc.getOutputStream();
Bytes content = new Bytes("Hello\nasdf\n adma");
os.write(content.arr, content.off, content.length());
os.close(); // should use try/finally or try/resource

在读取输出之前执行上述操作。请记住关闭 OutputStream 操作系统(使用 try/resource 或 try/finally)。因此,该进程知道 stdin 已完成并且可以完成对信息的处理。

原文由 Eugene Kuleshov 发布,翻译遵循 CC BY-SA 4.0 许可协议

我最近遇到了这个问题,只是想提一下,自 java 7 以来, 流程构建器 api 已经扩展。现在可以通过以下方式解决此问题:

 ProcessBuilder pb = new ProcessBuilder("yourcommand");
pb.redirectOutput(Redirect.INHERIT);
pb.redirectError(Redirect.INHERIT);
Process p = pb.start();

原文由 Benjamin Gruenbaum 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题