我想重定向子进程的标准输入和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”的字符串。 也许是因为父进程并不停留足够长的活着?
我还希望能够发送和接收多个命令。
你已经尝试尝试监听的输入流之前写入到输出流,所以它使你所看到的没有什么意义。 对于这个成功,你将需要使用单独的线程的两个流。
即
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();
}
}
你真的不应该忽略的错误流要么而是应该吞噬它,因为无视它有时会炒你的过程,因为它可能会用完的缓冲空间。
如今Runtime.getRuntime().exec()
已被弃用(所有的实际目的)。 更好地利用的ProcessBuilder类; 特别是,它的start()
方法将返回一个过程对象,具有用于访问stdin和stdout流,其可以在任何需要它们被重定向的方法。 看看这个职位进一步的细节。