在Groovy中执行外部命令并收集输出的差异

7
以下代码经常卡住(我认为是阻塞 I/O),有时候可以工作。
def static executeCurlCommand(URL){
    def url = "curl " + URL;
    def proc = url.execute();
    def output = proc.in.text;
    return output;
}

但是当我改变代码为
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));
}

我在 Stack Overflow 上看到了多个问题,它们都提供了第二种方法。虽然它能够正常工作,但我希望知道第一种方法的问题在哪里。

1个回答

7
第一种方法会填充缓冲区,然后阻塞等待更多的空间来写输出内容。
第二种方法通过单独的线程从缓冲区中流式传输输出内容,因此进程不会被阻塞。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接