在Groovy中收集执行外部命令的输出的区别

Ani*_*kur 6 java io groovy process

以下代码被卡住(我认为是阻塞I/O)多次(工作一段时间).

def static executeCurlCommand(URL){
    def url = "curl " + URL;
    def proc = url.execute();
    def output = proc.in.text;
    return output;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我将代码更改为

def static executeCurlCommand(URL){
    def url = "curl " + URL;
    def proc = url.execute();
    def outputStream = new StringBuffer();
    proc.waitForProcessOutput(outputStream, System.err)
    return outputStream.toString(); 
}
Run Code Online (Sandbox Code Playgroud)

它每次都很好用.我无法理解为什么第一种方式即通过proc.in.text挂起一段时间来输入?当我在Windows和cygwin上尝试它时,看起来不是特定于环境的问题.

为了测试/运行上面的方法,我尝试过 -

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

我在SO上看到了多个问题,并且都提供了第二种方法.虽然它运作良好但我希望我知道第一种方法有什么问题?有没有人以前遇到过这种情况?

tim*_*tes 5

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

第二种方法在进程运行时通过单独的线程从缓冲区输出流,因此进程不会阻塞.