且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-12-05 20:00:40

第一种方法填充缓冲区,然后阻止等待更多空间来输出第二种方法在进程运行时通过一个单独的线程从缓冲区输出流,所以进程不会阻塞。



b

Following code gets stuck(which I think is blocking I/O) many times (works some time).

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

But when I changes the code to

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

it works fine every time. I am not able to understand why does the 1st way i.e taking input by proc.in.text hangs some time? Does not look an environment specific problem as I tried it on Windows as well as cygwin.

To test/run the above method I have tried -

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

I have seen multiple questions on SO and all provide the 2nd approach. Although it works good I wish I could know whats wrong with 1st approach ? Has anyone has encountered this scenario before?

The first approach fills a buffer up and then blocks waiting for more room to write output to.

The second approach streams output from the buffer via a separate thread as the process is running, so the process doesn't block.