我正在尝试重定向 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”字符串。
也许是因为父进程存活的时间不够长?
我还希望能够发送和接收多个命令。
在尝试侦听输入流之前,您已尝试写入输出流,因此您什么也看不到是有道理的。为了成功,您需要为两个流使用单独的线程。
i.e.,
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();
}
}
而且您确实也不应该忽略错误流,而是应该吞噬它,因为忽略它有时会破坏您的进程,因为它可能会耗尽缓冲区空间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)