java - Apache Commons exec PumpStreamHandler 连续输入

标签 java inputstream apache-commons outputstream apache-commons-exec

我正在尝试使用 Apache Commons exec 解决与命令行进程的交互。我被以下代码困住了:

ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayOutputStream ins = new ByteArrayOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(ins);
BufferedWriter writer = new BufferedWriter(ow);
ByteArrayInputStream in = new ByteArrayInputStream(ins.toByteArray());
PumpStreamHandler psh = new PumpStreamHandler(out, null, in);
CommandLine cl = CommandLine.parse(initProcess);
DefaultExecutor exec = new DefaultExecutor();
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
exec.setStreamHandler(psh);
try {
    exec.execute(cl, resultHandler);
    int i = 0;
    while (true) {
        String o = out.toString();
        if (!o.trim().isEmpty()) {
            System.out.println(o);
            out.reset();
        }
        // --- PROBLEM start ---
        if (i == 3) {
            writer.write(internalProcessCommand); 
            // string with or without trailing \n, both tested
            writer.flush();
            writer.close();
            // tested even ins.write(internalProcessCommand.getBytes())
        }
        // --- PROBLEM end ---
        Thread.sleep(3000);
        i++;
    }
} catch (ExecuteException e) {
    System.err.println(e.getMessage());
}

我希望我的代码是清楚的。我在清除流的同时连续读取 out 并在 3 秒后打印它。问题是 in 的输入传递给 PumpStreamHandler。我需要从代码本身连续、动态地传递进程命令,就像我通过 CLI 与进程交互一样。当我简单地使用 System.in 作为 PumpStreamHandler 参数时,我可以从控制台编写进程命令。我怎样才能从代码中传递字符串以获得相同的结果?

编辑: 我还尝试连接 PipedInputStreamPipedOutputStream 接收数据,但似乎只有在关闭 PipedOutputStream 后才能读取数据,这使得它不可重用,因此我无法实现交互性。

编辑 2: 自己解决了。解决方案在下面的答案中。哎呀。 :-)

最佳答案

解决方案是复制 PumpStreamHandler 的实现和 StreamPump ,比如说 ImmediatePumpStreamHandler 和 ImmediateStreamPump,并进行以下两项更改:

  • 在 ImmediateStreamPump 第 108 行的 os.write(buf, 0, length); 之后直接添加 os.flush();
  • 在 ImmediatePumpStreamHandler 的第 269 行将 new StreamPumper(...) 更改为 new ImmediateStreamPump(...)

关于java - Apache Commons exec PumpStreamHandler 连续输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50398031/

相关文章:

java - 基本网络应用程序不适用于 Jersey

java - 如何读取/打开名称中有空格的文件

java - 如何处理创建的损坏文件但发生 IOException?

Java从运行时获取特定行?

java - 是否有类似 Apache Commons 之类的 Java 库的项目?

java - 在嵌入式独立环境中测试 apache pulsar 功能

java - RecyclerView 中的 Android Spinner 选中时获取当前 View

未触发 Java HtmlUnit onchange 事件

java - 缺少方法 org.apache.commons.io.FileUtils.forceMkdirParent?

java - 使用应用程序 android 将图像上传到谷歌云存储