Java 侦听控制台命令输出

Java 侦听控制台命令输出,java,bufferedreader,processbuilder,Java,Bufferedreader,Processbuilder,我想在我的Java应用程序中运行一个console命令,它侦听传入的消息,并在收到消息时记录到控制台。console命令在终端中执行时运行良好。所以我想运行这个命令,然后在它输出一行时执行一些操作,然后继续运行并侦听其他新消息。我通过以下代码进行了尝试: try { ProcessBuilder builder = new ProcessBuilder(PYTHON_PATH, YOWSUP_CLI_PATH, "demos", "-r", "-c", YOWSUP_CONFIG);

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

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();
}
但当我运行这段代码时,它会记录“Started listening…”字符串,所以我会发送一条消息来尝试它,但它不会记录任何内容,只会继续运行而不做任何事情


如果我解释不正确,就这么说吧

您可以像这样使用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();
        }

我在命令中使用了“-u”参数,并使用了from MadProgrammer进行了修复。

看看,也可以尝试使用
ProcessBuilder\inheritaio
——我假设您正在尝试运行pythoncommand@MadProgrammer谢谢python命令中的“-u”参数起到了作用。
ProcessBuilder
通常是首选的,因为它更易于配置,但更大的问题是python在它这方面做了一些奇怪的事情,这有时会阻止我们读取它的输出,至少在它退出之前是如此