Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProcessBuilder:进程的OutputStream(读取器)从未为*某些*命令做好准备()_Java_Shell_Cygwin_Outputstream_Processbuilder - Fatal编程技术网

Java ProcessBuilder:进程的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

为了进行测试,我编写了一个从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包装到不同的线程似乎是一种解决方案。但如果这确实是解决办法,那么为什么呢

还有一个问题:有人能解释为什么直截了当的方法会失败,以及在什么情况下会发生这种情况吗?从这个示例中,我可以排除这是参数的表示方式或特定的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/打电话时尝试过,但没有成功。