同时运行外部程序并通过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词汇表中的此条目 。 它还说明了如何使用线程与外部进程通信。
- Android:当软输入键盘出现时,Recyclerview不会resize
- Java – 读取文件并拆分成多个文件
- Java ProcessBuilder process.destroy()不会在winXP中杀死子进程
- Android – 在渲染线程内结束活动
- java.lang.IllegalArgumentException:at android.view.Surface.unlockCanvasAndPost(Native Method)
- 位置管理器无法在Android 4.0.2模拟器中运行
- + =和= +之间的差异
- 为什么List 不是List 的子类型?
- GLSurfaceView / SurfaceView重叠