我已经编写了一个接口来从Java调用shell命令以进行测试。对于一些命令,这很好,但对于其他命令,进程的OutputStream永远不会准备好()。有人有解释吗?我给出了完整的代码:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.err.print("cmd: ");
String line=in.readLine();
以下内容均适用于" cat -n"而不适用于" sed s / a / e /"
ProcessBuilder pb = new ProcessBuilder(Arrays.asList(("bash -c \""+line+"\"").split(" ")));
// ProcessBuilder pb = new ProcessBuilder(Arrays.asList(("cmd /C "+line).split(" ")));
// ProcessBuilder pb = new ProcessBuilder("cmd","/C",line);
// ProcessBuilder pb = new ProcessBuilder("bash","-c",line);
// ProcessBuilder pb = new ProcessBuilder(Arrays.asList(line.split(" ")));
与流程的互动:
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedWriter toP = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
BufferedReader fromP = new BufferedReader(new InputStreamReader(p.getInputStream()));
for(line = in.readLine(); line!=null; line=in.readLine()) {
toP.write(line+"\n");
toP.flush();
System.err.println("stdin: \""+line+"\"");
while(!fromP.ready()); // sed hangs, cat doesn't
System.out.println("result: \""+fromP.readLine()+"\"");
}
可以在ProcessBuilder问题上找到大量信息,对于大多数问题,将stdin和stdout包装到不同的Threads似乎是一个解决方案。但如果确实这是解决方案,那么为什么呢?
进一步说:有没有人解释为什么直接的方法失败以及在什么情况下会发生这种情况?从示例中,我可以排除它是参数的呈现方式或特定的shell(cmd / bash)。
我在安装了Cygwin的Windows7机器上使用Java 1.6,因此同时使用bash和cmd。这可能是一个Cygwin问题吗?