groovy - 无法从 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 机器上运行。
解决方案
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)
推荐阅读
- javascript - 如何将 JSON 转换为 multipart/form-data
- reactjs - 如何解决 gatsby js 中的依赖错误?
- c# - Polly 同步重试
- javascript - 状态的功能被另一个状态破坏了?
- javascript - 有没有办法使用反应将此字典列出到前端(显示在浏览器中)?
- python - 抓取超时。:在 pypylon usb 相机帧抓取中抛出 TimeoutException(文件'InstantCameraImpl.h',第 1064 行)
- arrays - 切换数组元素的问题
- yaml - 将逗号分隔的字符串转换为 yaml 中的列表
- css - 如何修复网页的移动可读性?
- python - 具有 Charfield 计数和零值的 Django 模型