我想用apache commons exec运行一个交互式命令。一切正常,除了执行命令并等待用户输入时,直到按Enter才在控制台中看不到输入,这实际上使它无法使用。

这是一个交互式程序的示例:

public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while (true) {
            System.out.print("=> ");
            try {
                line = in.readLine();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(line);
        }
    }

现在,我要使用apache commons exec执行该命令,如下所示:
public static void main(String[] args) {
    Executor ex = new DefaultExecutor();
    ex.setStreamHandler(new PumpStreamHandler(System.out, System.err, System.in));
    CommandLine cl = new CommandLine("java");
    cl.addArguments("-cp target\\classes foo.bar.Main");

    try {
        ex.execute(cl);
    } catch (ExecuteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

就像我说的那样,它基本上可以正常工作,我会收到“=>”提示,但是当我键入某些内容时,直到按回车键时才看到。我正在Windows 7上使用cmd提示进行此操作。
我希望能获得有关如何实现所需行为的任​​何提示。

编辑:它可以在linux 上按预期工作。我猜这是Windows cmd提示符的问题。我仍然想尽可能地使这项工作可行,因此,我希望对Windows上的这种行为有任何见解。

Edit2:我还用msys shell和powershell进行了测试,它们都表现出相同的问题。

Edit3:我通过启动单独的cmd提示符来解决此问题。这行得通,但我仍然想了解原因。
CommandLine cl = new CommandLine("cmd");
cl.addArguments("/C java -cp target\\classes foo.bar.Main");

谢谢

拉乌尔

最佳答案

我不确定您在这里会发生什么。如果产生的进程被设计为等待从其输入中读取信息,那么当它做到这一点就不足为奇了吗?

如果这是问题所在,而您的问题是“我如何使我的程序自动将换行符发送到生成的进程的输入?”,则需要定义一个OutputStream以将输入写入并保持ExecuteStreamHandler将其附加到进程。类似于以下内容:

Executor ex = new DefaultExecutor();

// Create an output stream and set it as the process' input
OutputStream out = new ByteArrayOutputStream();
ex.getStreamHandler().setProcessInputStream(out);
...
try
{
    ex.execute(cl);
    out.write("\n".getBytes()); // TODO use appropriate charset explicitly
...

10-08 12:57
查看更多