同时运行外部程序并通过stdin / stdout与之通信

我希望能够与我的Java代码同时运行外部程序,即我想启动程序,然后将控制权返回给调用方法,同时保持外部程序同时运行。 然后,Java代码将继续生成输入并将其发送到外部程序并接收输出。

我不想继续加载外部程序,因为它有很高的开销。 完成此任务的最佳方法是什么? 谢谢!

看看ProcessBuilder 。 一旦设置了ProcessBuilder并执行了start ,您就可以使用Process的句柄来输入和读取输出。

这是一个让你入门的片段:

 ProcessBuilder pb = new ProcessBuilder("/bin/bash"); Process proc = pb.start(); // Start reading from the program final Scanner in = new Scanner(proc.getInputStream()); new Thread() { public void run() { while (in.hasNextLine()) System.out.println(in.nextLine()); } }.start(); // Write a few commands to the program. PrintWriter out = new PrintWriter(proc.getOutputStream()); out.println("touch hello1"); out.flush(); out.println("touch hello2"); out.flush(); out.println("ls -la hel*"); out.flush(); out.close(); 

输出:

 -rw-r--r-- 1 aioobe aioobe 0 2011-04-08 08:29 hello1 -rw-r--r-- 1 aioobe aioobe 0 2011-04-08 08:29 hello2 

你可以使用Runtime.getRuntime()启动外部应用程序.exec(…)

要将数据发送到外部程序,您可以在Processes输出流上发送数据(从exec获取Process对象),也可以打开套接字并以此方式进行通信。

我想你会发现类java.lang.Process的Javadoc很有帮助。 值得注意的是,您可以从Process获取输入和输出流,以便在它运行时与其进行通信。

我的第二个关于使用ProcessBuilder的答案。 如果您想了解有关此内容的更多详细信息,以及为什么要将其更喜欢Runtime.exec() ,请参阅Java词汇表中的此条目 。 它还说明了如何使用线程与外部进程通信。