Java Groovy中执行外部命令时收集输出的差异

Java Groovy中执行外部命令时收集输出的差异,java,groovy,process,io,Java,Groovy,Process,Io,下面的代码多次被卡住(我认为是阻塞了I/O)(有时会起作用) 但是当我把代码改成 def static executeCurlCommand(URL){ def url = "curl " + URL; def proc = url.execute(); def outputStream = new StringBuffer(); proc.waitForProcessOutput(outputStream, System.err) return outp

下面的代码多次被卡住(我认为是阻塞了I/O)(有时会起作用)

但是当我把代码改成

def static executeCurlCommand(URL){
    def url = "curl " + URL;
    def proc = url.execute();
    def outputStream = new StringBuffer();
    proc.waitForProcessOutput(outputStream, System.err)
    return outputStream.toString(); 
}
每次都很好用。我不明白为什么第一种方式,即通过
proc.in.text
获取输入会挂起一段时间?当我在Windows和cygwin上尝试时,它看起来并不是一个特定于环境的问题

要测试/运行我尝试过的上述方法-

public static void main(def args){
    def url = 'http://mail.google.com';
    println("Output : " + executeCurlCommand(url));
}   

我已经看到了许多关于SO的问题,并且都提供了第二种方法。虽然效果很好,但我希望我能知道第一种方法有什么问题?以前有人遇到过这种情况吗?

第一种方法将缓冲区填满,然后阻塞等待更多空间将输出写入

第二种方法是在进程运行时通过一个单独的线程从缓冲区输出流,这样进程就不会阻塞

public static void main(def args){
    def url = 'http://mail.google.com';
    println("Output : " + executeCurlCommand(url));
}