首页 > 解决方案 > 无法从 groovy 执行捕获完整输出

问题描述

我正在尝试列出包含大约 1200 个项目的 svn 文件夹的内容。按照“在 groovy 脚本中执行外部程序并捕获输出”中的内容,我开发了以下代码

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 机器上运行。

标签: groovyprocessioprocessbuilder

解决方案


public void consumeProcessOutput(Appendable output, Appendable error)

从进程获取输出和错误流并读取它们以防止进程因输出缓冲区已满而阻塞。处理后的流数据附加到提供的 Appendable 中。为此,启动了两个线程,因此该方法将立即返回。即使调用了 waitFor(),线程也不会被 join()。要等待输出完全消耗,请调用 waitForProcessOutput()。

public void waitForProcessOutput()

从进程获取输出和错误流并读取它们以防止进程因输出缓冲区已满而阻塞。流数据被丢弃,但避免了由于输出缓冲区已满而导致的阻塞。如果您不关心标准或错误输出并且只希望进程静默运行,请使用此方法- 但是请谨慎使用,因为由于流数据被丢弃,因此当出现问题时可能难以追踪。为此,启动了两个线程,但是加入(),所以我们等待。正如 waitFor... 名称所暗示的那样,我们也一直等到完成。最后,关闭输出和错误流。

public void waitForProcessOutput(Appendable output, Appendable error)

从进程获取输出和错误流并读取它们以防止进程因输出缓冲区已满而阻塞。处理后的流数据附加到提供的 Appendable 中。为此,启动了两个线程,但是加入(),所以我们等待。正如 waitFor... 名称所暗示的那样,我们也一直等到完成。最后,关闭输入、输出和错误流。

所以,而不是

sproc.consumeProcessOutput(sout, serr)
sproc.waitForProcessOutput()

称呼

sproc.waitForProcessOutput(sout, serr)

推荐阅读