从java程序中调用其它程序.doc_第1页
从java程序中调用其它程序.doc_第2页
从java程序中调用其它程序.doc_第3页
从java程序中调用其它程序.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从java程序中调用其它程序/developer/TechTips/1999/tt1214.html 讨论了RMI (Remote Method Invocation,远程方法调用)如何用于程序间通讯,另一个用于通讯的技术是Runtime.exec() 方法。你可以用这个方法从一个运行阿java程序中调用另一个程序。Runtime.exec 也允许你执行和程序相关的操作,例如控制程序的标准输入输出,等待程序的结束并得到它的退出状态。下面是一个简单的C程序,用来说明这些特性:#include int main() printf(testing );return 0;这个程序写字符串testing到标准输出,然后用退出状态0终止程序。为了在java程序中执行这个简单的程序,先编译这个c程序:$ cc test.c -o test(译者注:对于linux用户,可以用gcc test.c ?o test,对应windows用户可以用相应的c语言编译程序编译成可执行程序test.exe) (你的 C 编译器可能要求不同的参数)然后使用下面的代码调用那个程序:import java.io.*;import java.util.ArrayList;public class ExecDemo static public String runCommand(String cmd)throws IOException / set up list to capture command output linesArrayList list = new ArrayList();/ start command runningProcess proc = Runtime.getRuntime().exec(cmd);/*译者注:前面的声明应该改成java.lang.Process,即:java.lang.Process proc = Runtime.getRuntime().exec(cmd);如果不改的话可能编译不同通过,在译者的机器上使用jdk1.2,编译出现5个错误使用jdk1.4编译出现4个错误*/ get commands output stream and/ put a buffered reader input stream on itInputStream istr = proc.getInputStream();BufferedReader br =new BufferedReader(new InputStreamReader(istr);/ read output lines from commandString str;while (str = br.readLine() != null)list.add(str);/ wait for command to terminatetry proc.waitFor();catch (InterruptedException e) System.err.println(process was interrupted);/ check its exit valueif (proc.exitValue() != 0)System.err.println(exit value was non-zero);/ close streambr.close();/ return list of strings to callerreturn (String)list.toArray(new String0);public static void main(String args) throws IOException try / run a commandString outlist = runCommand(test);/ display its outputfor (int i = 0; i outlist.length; i+)System.out.println(outlist);catch (IOException e) System.err.println(e);演示程序调用方法runCommand 实际运行程序。String outlist = runCommand(test);这个方法使用一个输入流钩取程序的输出流,因此它可以读取程序的输出,然后将之存入一个字符串列表。 InputStream istr = proc.getInputStream();BufferedReader br =new BufferedReader(new InputStreamReader(istr);String str;while (str = br.readLine() != null)list.add(str);在所有的输出都被读取后,调用waitFor 等待程序终止,然后调用exitValue 读取程序的退出状态值。如果你做过很多系统编程的话,例如UNIX系统调用,这个方法你应该很熟悉。(这个例子假设当前路径包含在你的shell的执行路径上)。如果你使用UNIX系统,你可以用:runCommand(ls -l);代替:runCommand(test);(译者注:一个更为通用的就是runCommand(java);,译者使用runCommand(dir);在windows2000下得到的结果是程序IO异常,在linux系统下没有测试过。)得到当前路径下的所有文件的长列表。但是用这个办法得到列表突出了使用Runtime.exec 的一个基本的弱点?你调用的程序变成不可移植的。也就是说,Runtime.exec 是可移植的,在不同的java实现中都存在,但是被调用程序不一定是这样的,在Windows系统下没有程序叫ls 。假设你运行Windows NT 而你决定使用runCommand(dir);纠正这个问题,dir 是ls 的等同的命令。这不能工作,因为dir 不是一个可执行程序。它内建于shell (命令解释器) CMD.EXE。因此你应当使用:runCommand(cmd /c dir);这里 cmd /c command 是 调用shell 并执行指定的命令并退出。 类似的,对于一个UNIX shell ,例如Korn shell,你可能应该用: runCommand(ksh -c alias);这里 alias 是shell 的内建命令。在这个情况下的输出是shell 的别名的列表。在上面获取目录列表的例子中,你可以用可移植的java程序到达相同的结果。例如:import java.io.File;public class DumpFiles public static void main(String args) String list = new File(.).list();for (int i = 0; i list.length; i+)System.out.println(list);给出当前目录下所有文件和目录的列表。因此在大多情况下,使用ls/dir 可能没有意义。使使用Runtime.exec有意义的一个情况就是允许用户指定一个编辑器或者文字处理程序(就像Emacs 或者 Vi 或者Word) 编辑文件。这是大型程序的一个通常的特性。程序将有一个配置文件指定编辑器的本地路径,然后使用这个路径调用Runtime.exec。Runtime.exec 的一个微妙的地方就是它如何查找文件。例如,你使用:Runtime.exec(ls);那么ls 如何被找到呢?在JDK 1.2.2 上的试验表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论