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

bwleehnv  于 2023-03-16  发布在  Java
关注(0)|答案(1)|浏览(94)

下面的代码被卡住(我认为是阻塞了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));
}

我看过很多关于SO的问题,都提供了第二种方法。虽然它很好用,但我希望我能知道第一种方法有什么问题。

v8wbuo2f

v8wbuo2f1#

第一种方法先填充缓冲区,然后阻塞,等待更多空间写入输出。
第二种方法是在进程运行时通过单独的线程从缓冲区流式输出,这样进程就不会阻塞。

相关问题