我正在尝试列出包含大约1200个项目的svn文件夹的内容。在“Execute a external program within a groovy script and capture the output”中,我开发了以下代码
def svnCommand = "svn list ${repoUrl}"
def sout = new StringBuilder()
def serr = new StringBuilder()
Process sproc = svnCommand.execute()
sproc.consumeProcessOutput(sout, serr)
sproc.waitForProcessOutput()
println sout
如果我要运行这个脚本,无论我设置初始容量多高,我都会得到一个截断的输出。输出显然被截断,如以下摘录
所示...
SS0D76I0.cpy
SS0D76M0.cpy
SS0D76N0.cpy
SS
有关捕获命令的完整输出的任何建议?该脚本在Windows机器上运行。
答案 0 :(得分:3)
public void consumeProcessOutput(Appendable output, Appendable error)
:
从进程获取输出和错误流并读取它们以防止进程因完整输出缓冲区而阻塞。处理后的流数据将附加到提供的Appendable。为此,启动了两个Thread,因此该方法将立即返回。 即使调用waitFor(),线程也不会是join()ed。要等待输出完全消耗,请调用waitForProcessOutput()。
public void waitForProcessOutput()
从进程获取输出和错误流并读取它们以防止进程因完整输出缓冲区而阻塞。丢弃流数据但避免了由于完整输出缓冲而导致的阻塞。 如果您不关心标准或错误输出并且只是希望进程以静默方式运行,请使用此方法 - 但请小心使用,因为由于流数据被丢弃,因此可能很难当出现问题时追踪。为此,启动了两个Thread,但是join()ed,所以我们等待。正如waitFor ...这个名字所暗示的那样,我们也要等到我们完成。最后,关闭输出和错误流。
public void waitForProcessOutput(Appendable output, Appendable error)
从进程获取输出和错误流并读取它们以防止进程因完整输出缓冲区而阻塞。处理后的流数据将附加到提供的Appendable。为此,启动了两个Thread,但是join()ed,所以我们等待。正如waitFor ...这个名字所暗示的那样,我们也要等到我们完成。最后,关闭输入,输出和错误流。
所以,而不是
sproc.consumeProcessOutput(sout, serr)
sproc.waitForProcessOutput()
呼叫
sproc.waitForProcessOutput(sout, serr)