Java ProcessBuilder:进程的OutputStream(读取器)从未为*某些*命令做好准备()
为了进行测试,我编写了一个从Java调用shell命令的接口。对于一些命令,这工作得很好,但对于其他命令,进程的OutputStream从未准备好。有人有解释吗?我给出完整的代码:Java ProcessBuilder:进程的OutputStream(读取器)从未为*某些*命令做好准备(),java,shell,cygwin,outputstream,processbuilder,Java,Shell,Cygwin,Outputstream,Processbuilder,为了进行测试,我编写了一个从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/ Pr
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包装到不同的线程似乎是一种解决方案。但如果这确实是解决办法,那么为什么呢
还有一个问题:有人能解释为什么直截了当的方法会失败,以及在什么情况下会发生这种情况吗?从这个示例中,我可以排除这是参数的表示方式或特定的shell cmd/bash
我在安装了Cygwin的Windows7机器上使用Java1.6,因此使用了bash和cmd。这可能是Cygwin的问题吗?显而易见的原因似乎是消费命令的缓冲。sed-u s/a/e工程。作为一个快速的解决办法,繁忙的等待阻塞在同时!fromP.ready;需要在每次迭代中写入,例如,a\n。问题是,如果程序不等待输入,而是进行一些计算,缓冲区可能很容易溢出,因此这也不理想。不过,填充技巧并不总是有帮助的。我在给senna ml.nec-labs.com/senna/打电话时尝试过,但没有成功。