你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Java专栏
从java程序中调用其它程序(2)
 

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 上的试验表明是搜索PATH 环境变量。这就像你在shell中执行命令时所发生的情况。但是文档中并没有说明这点,因此应该小心使用。你不能假设搜索路径已经设置。就像上面讨论的那样在有限的方式上使用Runtime.exec 可能更有意义,使用绝对路径。
也有不同的Runtime.exec 允许你指定环境字符串数组。(译者注:具体方式请参看API文档)。
(编辑:aniston)

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089