Java调用外部程序解决方案.docxVIP

  • 8
  • 0
  • 约2.34千字
  • 约 4页
  • 2021-04-13 发布于天津
  • 举报
Java调用外部程序解决方案 并希关键字 Java 外部程序 CMD 进程 调用 Process 并希 最近接触一个需求, 是利用Java调用本地命令行程序, 望Java程序能与该命令行程序进行交互,Java对该程序的操 作如同在终端中对程序的操纵一样。 在技术调研的过程中,遇到了几个问题: 如何 Java 调用命令行程序 如何利用Java向命令行程序的标准输入写入字符流 如何利用Java即时地得到命令行程序的标准输出流。 如何利用Java即时地得到命令行程序的标准错误流 、调用命令行程序 这个很简单,Java调用的方法为 Process process = Runtime.getRuntime().exec(#8220;command name#8221;); Process 的 JavaDoc 地址: /j2se/1.4.2/docs/api/java/lang/Process.html 、标准输出 注意,在这里标准输出指的是 Java程序以标准输出的方式发 出字节流,这些字节流会以标准输入的方式进入被调用的命 令行程序 OutputStream pOutputStream = process.getOutputStream(); PrintWriter outputWriter = new PrintWriter(pOutputStream, true); outputWriter.print(string); Printwriter的第二个构造参数一定要选为 true,这样才能自 动 flush 进入外部程序,不然,没有 Flush ,你向被调用程序 所写的输入,只有在下一次缓冲被 Flush 的时候才能发挥作 用,这样,当你的输入很少时, 你虽然在代码里 print 了命令, 但是外部程序并没有得到他,就一直阻塞,这是开发者经常 会遇到的问题。 三、标准输入和错误输入 private InputStream pErrorStream = process.getErrorStream(); private InputStream pInputStream =process.getInputStream(); 这两个输入是用来接受外部程序的反馈的,外部程序通常会 向标准终端打印字符,这些字符会通过这两个流得到,经过 测试,我们发现一个问题,如果外部程序在输出信息时,没 有用 flush 也会出现问题,比如 C 语言的程序 scanf(#8220;%d#8221;, amp;i); printf(#8220;%d#8221;, i); 这段代码在运行时,虽然在终端里会即时的显示出来,但是 却不能及时地发送给 pInputStream ,这是因为程序输出使用 i)); i)); 了缓冲机制造成的,所以,这造成的困难是如果你没有外部 程序的源码,你就很难将输出即时显示出来,我目前还没有 找到解决方案,如果你有源码就好办了,在源码中设置输出 为即时 flush 就好了,我用笨办法来说明: scanf(#8220;%d#8221;, amp;i); printf(#8220;%d#8221;, i); fflush(stdout); 这样, fflush(stdout) 之后, pInputStream 就会得到输入了。 四、综合 面我们用三个线程来进行一个简单的与外部程序的交互 过程的设计 线程一、 process.waitFor() ,负责建立线程并等待线程结束 线程二、 for (int i = 0; i gt; -1; i = pInputStream.read(inBuffer)) { // We have a new segment of input, so process it as a String.. System.out.print(new String(inBuffer, 0, 负责接收外部程序的输出信息 线程三、 // Read the ErrorStream in a loop until we find no more bytes to read.. for (int i = 0; i gt; -1; i = pErrorStream.read(errBuffer)) { // We have a new segment of error, so process it as a String.. Systerm.err.print(new String(errBuffer, 0, i)); 负责接收外部程序的错误输出信息 在适当的地方,调用 outputWriter.print(string); 向程序写入字 符流。 推荐参考资料 /KB/java/ProcessHelper.aspx?disp

文档评论(0)

1亿VIP精品文档

相关文档