【问题标题】:Listening to console command output监听控制台命令输出
【发布时间】:2015-12-15 01:54:25
【问题描述】:

我想在我的 Java 应用程序中运行一个控制台命令,该命令侦听传入的消息并在收到消息时记录到控制台。当我在终端中执行控制台命令时,它运行良好。所以我想运行命令,然后在它输出一行时做一些事情,然后继续运行并监听其他新消息。我通过以下代码进行了尝试:

try {
    ProcessBuilder builder = new ProcessBuilder(PYTHON_PATH, YOWSUP_CLI_PATH, "demos", "-r", "-c", YOWSUP_CONFIG);
    builder.redirectErrorStream(true);
    Process p = builder.start();
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String line = "";
    log.info("Started listening...");

    // It does nothing from here on
    while ((line = reader.readLine()) != null) {
        log.info(line);
    }
    log.info("Stopped listening.");
} catch (Exception e) {
    e.printStackTrace();
}

但是当我运行此代码时,它会记录“开始监听...”字符串,所以我发送一条消息尝试一下,但它没有记录任何内容,只是继续运行而不做任何事情。

如果我没有正确解释,请直说!

【问题讨论】:

  • 看看this,也可以尝试使用ProcessBuilder#inheritIO - 我假设您正在尝试运行python命令
  • @MadProgrammer 谢谢!我的 python 命令中的“-u”参数起到了作用。

标签: java bufferedreader processbuilder


【解决方案1】:

您可以像这样使用 rt.exec 命令:

try {               
            proc = rt.exec(command);
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
            int value=0;
            String line = null;
            while ((line = stdInput.readLine()) != null) {      
                System.out.println(line);
            }
            while ((line = stdError.readLine()) != null) {
                System.out.println(line);
            }
            proc.waitFor();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

【讨论】:

  • ProcessBuilder 通常是首选,因为它更具可配置性,但更大的问题是 python 做了一些奇怪的事情,这有时会阻止我们读取它的输出,至少在它退出之前是这样跨度>
【解决方案2】:

我在命令中使用“-u”参数修复了它,使用了来自 MadProgrammer 的 this answer

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多