【发布时间】:2011-11-07 18:32:24
【问题描述】:
我正在通过我的 Java 程序在本机窗口中执行 cmd 进程。我希望能够查看分叉进程的输入和输出。但是,我似乎无法从 Java 程序中向其写入任何内容。
当我尝试在 Windows 的命令提示符上写入一组字符时,我有点期待它会在屏幕上打印一些东西——任何东西。所以,如果我给它无意义的垃圾,那么它应该打印它不理解那个命令。
但是,在以下代码中将我的垃圾字符串写入子进程的 OutputStream 之后:
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("cmd");
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
PrintWriter out = new PrintWriter(process.getOutputStream());
String line = null;
out.println("My Garbage String");
while((line = readLine()) != null)
System.out.println(line);
程序在while((line = readLine()) != null)处停止。
因此,父进程显然是阻塞的,直到子进程获得一些输入并解除阻塞并将该输入发送到父进程。但是,当我将任何内容写入PrintWriter 的println() 方法时,我正在给子进程一些输入,不是吗?
更新
现在,由于得到了一些答案,我决定澄清我的问题所在。我可以很好地读取命令提示符的输出。事实上,当我第一次运行它时,我得到的输出与在命令提示符下键入“cmd”时通常得到的输出相同。
例如,下面的代码示例:
Process process = Runtime.getRuntime().exec("cmd");
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
PrintWriter out = new PrintWriter(process.getOutputStream());
String line = null;
do
{
line = in.readLine();
System.out.println(line);
}while(line!=null)
代码的输出如下:
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 微软公司。
如您所见,命令提示符正在为我的父进程提供一些输出。但是,在我的 IDE 中以调试模式运行它时,我发现它只是简单地停在 line=in.readLine(); 行。因此,子进程阻塞,因为没有其他内容可打印。
因此,当我尝试使用其OutputStream 属性为其提供一些输入时,它似乎没有响应。相反,程序在line=in.readLine(); 处阻塞。
为了回应一位发帖者的建议,您提到的文章(当 Runtime.exec() 不会),它只是从 OutputStream 和 ErrorStream 属性中获取输出.它没有提到除了在运行Runtime.exec(args) 时以数组形式给出的初始执行参数之外,我如何给它任何类型的输入。
为了模拟我最初想要做的事情(即给它随机垃圾并让它打印出它不理解该命令),我可以只需在我的代码中输入Runtime.getRumtime().exec("cmd /c random garbage);并运行它。但是,这不是我想做的。我想在它已经开始执行后与命令提示符进行通信。
最终,我希望能够与其他程序进行交互,这些程序通常需要您在从 Java 程序执行后与它们交互。然而,如果我能告诉它做什么的唯一时间是我指定它的执行参数,那么我将无法以我想要的方式使用 Java 与单独的进程进行交互。
如果有人知道如何实现这一点,请告诉我。谢谢。
【问题讨论】:
-
投反对票,因为这不是“Java 子进程”问题,而是我在回答中描述的基本编程理解问题。
-
你应该为你的问题选择一个答案