重定向标准输入和标准输出的Java(Redirect stdin and stdout in Jav

2019-06-24 03:22发布

我想重定向子进程的标准输入和stdout在Java中,最终我要去有输出到一个JTextArea什么的。

这里是我当前的代码,

Process cmd = Runtime.getRuntime().exec("cmd.exe");

cmd.getOutputStream().write("echo Hello World".getBytes());
cmd.getOutputStream().flush();

byte[] buffer = new byte[1024];
cmd.getInputStream().read(buffer);
String s = new String(buffer);

System.out.println(s);

输出看起来是这样的:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\(Current Directory)>

我期待看到输出的“Hello World”的字符串。 也许是因为父进程并不停留足够长的活着?

我还希望能够发送和接收多个命令。

Answer 1:

你已经尝试尝试监听的输入流之前写入到输出流,所以它使你所看到的没有什么意义。 对于这个成功,你将需要使用单独的线程的两个流。

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class Foo {
   public static void main(String[] args) throws IOException {
      Process cmd = Runtime.getRuntime().exec("cmd.exe");

      final InputStream inStream = cmd.getInputStream();
      new Thread(new Runnable() {
         public void run() {
            InputStreamReader reader = new InputStreamReader(inStream);
            Scanner scan = new Scanner(reader);
            while (scan.hasNextLine()) {
               System.out.println(scan.nextLine());
            }
         }
      }).start();

      OutputStream outStream = cmd.getOutputStream();
      PrintWriter pWriter = new PrintWriter(outStream);
      pWriter.println("echo Hello World");
      pWriter.flush();
      pWriter.close();
   }
}

你真的不应该忽略的错误流要么而是应该吞噬它,因为无视它有时会炒你的过程,因为它可能会用完的缓冲空间。



Answer 2:

如今Runtime.getRuntime().exec()已被弃用(所有的实际目的)。 更好地利用的ProcessBuilder类; 特别是,它的start()方法将返回一个过程对象,具有用于访问stdin和stdout流,其可以在任何需要它们被重定向的方法。 看看这个职位进一步的细节。



文章来源: Redirect stdin and stdout in Java