没有合适的资源?快使用搜索试试~ 我知道了~
Java中使用Runtime和Process类运行外部程序.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 162 浏览量
2022-06-09
20:04:19
上传
评论
收藏 49KB DOCX 举报
温馨提示
试读
31页
Java中使用Runtime和Process类运行外部程序
资源推荐
资源详情
资源评论
hp://www.cnblogs.com/xxpal/arcles/824963.html
Java
中使用
Runtime
和
Process
类运行外部程序
使用 方法可以在 程序里运行外部程序。
!
"!
#!
一般的应用程序可以直接使用第一版本,当有环境变量传递的时候使用后面的版本。其中 和
# 版本可以传递一个目录,标识当前目录,因为有些程序是使用相对目录的,所以就要使用这
个版本。
$%&'(
使用 )* 命令比如 时也要使用到调用。如果想与调用的程序进行交互,那么就要使用该
方法的返回对象 +%% 了,通过 +%% 的 ,,*和
-方法可以得到输入输出流,然后通过 , 可以得到程序对控制台
的输出信息,通过 * 可以给程序输入指令这样就达到了程序的交换功能。
用 . 编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通
过组合使用 . 提供的 类和 +%% 类的方法实现。下面是一种比较典型的程序模
式:
1
2 Processprocess=Runtime.getRuntime().exec(".\p.exe");
3 process.waitfor();
4
在上面的程序中,第一行的“//0是要执行的程序名,返回
当前应用程序的 对象,该对象的 方法指示 . 虚拟机创建一个子进程执
行指定的可执行程序,并返回与该子进程对应的 +%% 对象实例。通过 +%% 可以控
制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行。
但在 11% 平台上,如果处理不当,有时并不能得到预期的结果。下面是笔者在实际
编程中总结的几种需要注意的情况:
、执行 )* 的内部命令
如果要执行一条 )* 内部命令,有两种方法。一种方法是把命令解释器包含在 的
参 数 中 。 例 如 , 执 行 命 令 , 在 '2 上 , 可 写 成 3 $3 , 在
11%4"$45 下,可写成“$0,其中参数“$0表示命令执行后关闭
)* 立即关闭窗口。另一种方法是,把内部命令放在一个批命令 !67 文件中,在
. 程序中写成 3!673。如果仅仅写成 33,. 虚拟机则会报
运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台
以调用不同的命令解释器。后一种方法则不需要做更多的处理。
、打开一个不可执行的文件
打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。以打开
一个 1 文档 文件为例,. 中可以有以下两种写法:
1 exec("start.\\a.doc");
2 exec("Files\\MicrosoftOffice\\office\\winword.exe.\\
a.doc");
显然,前一种方法更为简捷方便。
、执行一个有标准输出的 )* 可执行程序
在 81% 平台上,运行被调用程序的 )* 窗口在程序执行完毕后往往并不会自动关
闭,从而导致 . 应用程序阻塞在 19语句。导致该现象的一个可能的原因是,该
可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利
用 . 中 +%% 类提供的方法让 . 虚拟机截获被调用程序的 )* 运行窗口的标准
输出,在 19命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:
1
2 Strings;
3 Processprocess=Runtime.getRuntime().exec("cmd/cdir\\
windows");
4 BufferedReaderbufferedReader=newBufferedReader(newInputS
treamReader(process.getInputStream());
5 while((s=bufferedReader.readLine())!=null)
6 System.out.println(s);
7 process.waitfor();
hp://www.javaeye.com/topic/72403
那就首先说点 类吧,他是一个与 .:; 运行时环境有关的类,这个类是 的。
我说几个自己觉得重要的地方。
、可以取得当前 .:; 的运行时环境,这也是在 . 中唯一一个得
到运行时环境的方法。
、 上其他大部分的方法都是实例方法,也就是说每次进行运行时调用时都要用到
方法。
、 中的 方法是退出当前 .:; 的方法,估计也是唯一的一个吧,因为我看到
!% 类中的 实际上也是通过调用 来退出 .:; 的,这里说明一下 .
对 返回值的一般规则(后边也提到了),< 代表正常退出,非 < 代表异常中止,这只
是 . 的规则,在各个操作系统中总会发生一些小的混淆。
、=1>?方法可以注册一个 =? 在 .:; 执行 %=1 的过程
中,方法的参数只要是一个初始化过但是没有执行的 2= 实例就可以。(注意,. 中的
2= 都是执行过了就不值钱的哦)
"、说到 =1>? 这个方法就要说一下 .:; 运行环境是在什么情况下 %=1
或者 7 的。文档上是这样写的,当最后一个非精灵进程退出或者收到了一个用户中断信号、
用户登出、系统 %=1、 的 方法被调用时 .:; 会启动 %=1 的过程,
在这个过程开始后,他会并行启动所有登记的 %=1=?(注意是并行启动,这就需要
线程安全和防止死锁)。当 %=1 过程启动后,只有通过调用 = 方法才能中止
%=1 的过程并退出 .:;。
那什么时候 .:; 会 7 退出那?首先说明一下,7 退出时 .:; 就是停止运行但并不一定
进行 %=1。这只有 .:; 在遇到 ,@A,BB 信号或者 11% 中止进程的信号、本地方法
发生类似于访问非法地址一类的内部错误时会出现。这种情况下并不能保证 %=1=?
是否被执行。
现在开始看这篇文章,呵呵。
首先讲的是 方法的所有重载。这里要注意的有一点,就是 7+%%
C!D这个方法中 C! 是一个执行的命令和参
数的字符串数组,数组的第一个元素是要执行的命令往后依次都是命令的参数, 我个人
感觉应该和 E 中的 中的环境变量是一样的, 中使用的是 F 的方式。
、 一个很糟糕的调用程序,代码如下,这个程序用 调用了一个外部命令之后马上使用
: 就对其返回值进行检查,让我们看看会出现什么问题。
GD
GD
7%%H-.
I
7%%
I
!
I
FD
+%%F33D
:F:D
!%3+%%:J3K:D
L=2=17
I
?2D
L
L
L
C9H-.%J
-J%%%19%(H-.
,2=-J%%=%
8+%%:';=
H-.H-.J
这里看原文就可以了解,这里主要的问题就是错误的调用了 : 来取得外部命令的返回
值(呵呵,这个错误我也曾经犯过),因为 : 这个方法是不阻塞的,程序在调用这个
方法时外部命令并没有返回所以造成了异常的出现,这里是由另外的方法来等待外部命令执行
完毕的,就是 1 方法,这个方法会一直阻塞直到外部命令执行结束,然后返回外部命令
执行的结果,作者在这里一顿批评设计者的思路有问题,呵呵,反正我是无所谓阿,能用就可
以拉。但是作者在这里有一个说明,就是 : 也是有好多用途的。因为当你在一个
+%% 上调用 1 方法时,当前线程是阻塞的,如果外部命令无法执行结束,那么你的
线程就会一直阻塞下去,这种意外会影响我们程序的执行。所以在我们不能判断外部命令什么
时候执行完毕而我们的程序还需要继续执行的情况下,我们就应该循环的使用 : 来取
得外部命令的返回状态,并在外部命令返回时作出相应的处理。
、对 : 处改进了的程序
GD
GD
7%%H-.
I
7%%
I
!
I
FD
+%%F33D
:F1D
!%3+%%:J3K:D
L=2=17
I
?2D
L
L
L
不幸的是,这个程序也无法执行完成,它没有输出但却一直悬在那里,这是为什么那?
.)A 文档中对此有如此的解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以
错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁,甚至死锁。
文档引述完了,作者又开始批评了,他说 .)A 仅仅说明为什么问题会发生,却并没有说明这个
问题怎么解决,这的确是个问题哈。紧接着作者说出自己的做法,就是在执行完外部命令后我
们要控制好 +%% 的所有输入和输出(视情况而定),在这个例子里边因为调用的是
.,而他在没有参数的情况下会将提示信息输出到标准出错,所以在下面的程序中我们要
对此进行处理。
GD
GD
7%%;-.
I
7%%
I
!
I
FD
+%%F33D
,%F-D
,%F1,%D
HM7F1HM%D
FD
!%3&(&$(3D
1=F7BNF
!%D
剩余30页未读,继续阅读
资源评论
oligaga
- 粉丝: 50
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- XILINXFPGA源码Xilinxspratan3xcs100E(VGAPS2)
- XILINXFPGA源码XilinxSPARTAN-3E入门开发板实例
- XILINXFPGA源码XilinxSdramVerilog和VHDL版本文档
- 物联网智能家居方案-基于Nucleo-STM32L073&机智云(大赛作品,文档齐全,可直接运行)(文档加Matlab源码)
- XILINXFPGA源码XilinxISE9.xFPGACPLD设计源码
- 成都市地图含高新区(高新南区,高新西区),天府新区,东部新区虚拟行政区划
- XILINXFPGA源码XilinxEDK设计试验
- XILINXFPGA源码XilinxEDKMicroBlaze内置USB固件程序
- 基于 django 的视频点播后台管理系统源代码+数据库
- 基于Java的网上医院预约挂号系统的设计与实现(部署视频)-kaic.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功