不阻塞地获取进程输出

2023-12-02

我想获得一个进程的输出(Git.exe准确地说)并将其转换为 String 对象。以前有时我的代码被阻止。然后我发现这是因为这个过程'ErrorStream有一些输出,我必须手动捕获它(我对此不感兴趣)。我将我的代码更改为:

public static String runProcess(String executable, String parameter) {
    try {
        String path = String.format("%s %s", executable, parameter);
        Process pr = Runtime.getRuntime().exec(path);

        // ignore errors
        StringWriter errors = new StringWriter();
        IOUtils.copy(pr.getErrorStream(), errors);

        StringWriter writer = new StringWriter();
        IOUtils.copy(pr.getInputStream(), writer);

        pr.waitFor();
        return writer.toString();
    } catch (Exception e) {
        return null;
    }
}

现在它大部分工作正常,但话又说回来,有时它会在这一行再次被阻止:IOUtils.copy(pr.getErrorStream(), errors);.

有什么方法可以让我得到输出git.exe不撞块?谢谢。


使用这个漂亮的文章StreamGobbler那里描述的类(我修改了一点)我解决了问题。我的实施StreamGobbler:

class StreamGobbler extends Thread {
    InputStream is;
    String output;

    StreamGobbler(InputStream is) {
        this.is = is;
    }

    public String getOutput() {
        return output;
    }

    public void run() {
        try {
            StringWriter writer = new StringWriter();
            IOUtils.copy(is, writer);
            output = writer.toString();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

我的功能是:

public static String runProcess(String executable, String parameter) {
    try {
        String path = String.format("%s %s", executable, parameter);
        Process pr = Runtime.getRuntime().exec(path);

        StreamGobbler errorGobbler = new StreamGobbler(pr.getErrorStream());
        StreamGobbler outputGobbler = new StreamGobbler(pr.getInputStream());

        // kick them off concurrently
        errorGobbler.start();
        outputGobbler.start();

        pr.waitFor();
        return outputGobbler.getOutput();
    } catch (Exception e) {
        return null;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不阻塞地获取进程输出 的相关文章

随机推荐

  • 将 NULL 数组填充到自定义聚合函数的最大长度

    从问题的回答来看如何对 varchar 使用 array agg 我们可以创建一个自定义聚合函数来聚合 Postgres 中的 n 维数组 如下所示 CREATE AGGREGATE array agg mult anyarray SFUN
  • TransactionScope 内的 Membership.GetUser() 抛出 TransactionPromotionException

    下面的代码抛出一个TransactionAbortedException带有消息 交易已中止 和内部TransactionPromotionException消息 尝试促进交易失败 using TransactionScope transa
  • C# 解析日期和时间

    我在应用程序中有一些代码 类似于 DateTime activityDate DateTime Parse tempDate tempTime Where tempDate是一个字符串 其值如 2009 12 01 即 yyyy mm dd
  • 在后台运行脚本?

    简单的问题 有没有办法在后台运行脚本而不运行终端 更多细节和背景 我有一个应用程序 它读取应用程序的 log 文件并从中提取信息 然后从日志中的信息提供信息和统计信息 应用程序的更新改变了 log 文件的写入方式 删除信息并以我无法预测的方
  • NetworkX:分层绘制图形

    我有一个按级别划分的图表 即 f e ids 0 100 are lowest level ids 101 500 are level 2 ids 501 1500 are level 3 and so on 有没有某种方法可以强制图形在分
  • 如何阻止过度访问我的网站的机器人?

    这个机器人不尊重nofollow noindex在robots txt中 我在 robots txt 中有这个 User agent Msnbot Disallow User Agent Msnbot 2 0b Disallow 到目前为止
  • Pyephem 计算当前太阳时

    我正在尝试根据 UTC 小时和经度计算当地太阳时 我已经浏览过ephem包 但无法确定执行此操作的直接方法 关于这个问题的类似问题要么引起固定位置 日出 月亮 日落 的计算 例如使用 PyEphem 计算黎明和日落时间 或接收简化方法的建议
  • pip install pydot 引发语法错误

    我从命令行运行 pip 尝试安装 pydot 因为 Django 的 django extensions 需要它来生成 UML 类图 当我运行命令时pip install pydot 它给了我这个错误 Collecting pydot Us
  • 用鼠标移动图片框

    我正在开发一个适用于 Windows Mobile Compact Framework 2 0 的应用程序 它有一个带有 PictureBox 的 WinForms 我想移动PictureBox的图像 但我不知道该怎么做 所以我选择移动Pi
  • Feed RDLC(本地)报告来自列表(实体框架)的报告

    我给自己找了一个BiningList学生 实体框架创建的类 我只想喂饱我的RDLC从中报告而不是使用DataSet或存储过程 该类包含多个属性 例如 string Name string FamilyName string Mid Date
  • Apache Rewrite:基于HTTP主机的图像目录

    我的软件支持多个域名 所有域名都指向服务器上的同一目录 当然每个域名都有不同的数据库 那么这些域 www example1 com www example2 com www example3 com 都指向 public html 在图像目
  • 如何检查 Reddit 帖子是否仅包含图像而没有其他内容?

    背景 我目前正在使用prawPython 3 7 的库 我的机器人需要做的一件事是检查某些 Reddit 子版块上的最新帖子 看看它们是否包含只是一个图像 没有其他任何东西 鉴于 Reddit 上有不同类型的帖子 仅上传图像的帖子和带有图像
  • 简单注入器身份 UserManager 注册错误

    我正在遵循洋葱架构并使用身份框架 在我的核心项目中 我有 public interface IUserRepository IDisposable Repository methods 在我的 Architecture Repository
  • 访问多维数组中任意深度的键

    如果我有一个包含以下内容的数组 key1 key2 key3 有什么方法可以将其映射到数组 array key1 key2 key3 不使用循环或 eval 数组示例 var key1 gt subkey1 gt finalkey gt v
  • 循环结构的迭代器

    以下代码显示了我目前拥有的内容 它是一个适配器 循环数据结构 main 函数展示了它是如何使用的 这 一切都很好而且很快 但我真的很想让迭代器结束 定义的结构circ 到目前为止涉及的所有方法 某种计数方案 如果使用循环器则计算范围 构建一
  • 使用 Visual Studio sdk 取消修饰函数名称

    要取消修饰 Visual Studio 生成的损坏的 C 名称 您可以使用undname exe 但是 如果您想避免每次需要未装饰时创建完整进程的开销 该怎么办 Visual Studio SDK 中是否有任何等效功能 VS2005 应该支
  • 哪些 Grails 项目文件不应该添加到版本控制中? (Grails 1.3.x)

    这个问题之前已经被问过 但不久前 对 Grails gitignore 的建议 这是针对 grails 1 0 x 的回答 Grails 1 3 x 项目中的哪些文件不应包含在版本控制中 See http grails org Checki
  • 静态类成员上未解析的外部符号

    非常简单地说 我有一个主要由静态公共成员组成的类 因此我可以将类似的函数组合在一起 但仍然需要从其他类 函数调用它们 无论如何 我在类公共作用域中定义了两个静态 unsigned char 变量 当我尝试在同一个类的构造函数中修改这些值时
  • Python 多处理模块的开销

    我正在使用multiprocessingPython 中的模块 并期望启动进程 创建队列以及向队列中放入值或从队列中获取值会产生一些开销 但是 如果子流程有足够的工作要做 我预计开销最终会被消除 运行一个简单的示例 如下所述 我生成的进程的
  • 不阻塞地获取进程输出

    我想获得一个进程的输出 Git exe准确地说 并将其转换为 String 对象 以前有时我的代码被阻止 然后我发现这是因为这个过程 ErrorStream有一些输出 我必须手动捕获它 我对此不感兴趣 我将我的代码更改为 public st