导读:
用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式:
...
Process process = Runtime.getRuntime().exec(".\\p.exe");
process.waitfor( );
...
在上面的程序中,第一行的“.\\p.exe”是要执行的程序名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行。
但在windows平台上,如果处理不当,有时并不能得到预期的结果。下面是笔者在实际编程中总结的几种需要注意的情况:
1、执行DOS的内部命令
如果要执行一条DOS内部命令,有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上, 可写成exec("cmd.exe /c dir"),在windows 95/98下,可写成“command.exe /c dir”,其中参数“/c”表示命令执行后关闭Dos立即关闭窗口。另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec("my_dir.bat")。如果仅仅写成exec("dir"),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。
2、打开一个不可执行的文件
打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。 以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:
exec("start .\\a.doc");
exec(" c:\\Program Files\\Microsoft Office\\office\\winword.exe .\\a.doc");
显然,前一种方法更为简捷方便。
3、执行一个有标准输出的DOS可执行程序
在windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java提供的Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:
... String ls_1;
Process process = Runtime.getRuntime().exec("cmd /c dir \\windows");
BufferedReader bufferedReader = new BufferedReader( \ new InputStreamReader(process.getInputStream()); while ( (ls_1=bufferedReader.readLine()) != null)
System.out.println(ls_1);
process.waitfor( );
今天在做客户端程序的自动更新,简单描述一下,就是从服务器上将更新包下载下来,然后在本地解压缩,最后删掉~功能很简单~
但是问题出在使用JAVA的ZIP模块做文件的解压缩不是想象的那么简单,资源需要释放,一个不小心就没有办法删除掉原有ZIP文件了~资源的占用确实是个大问题,但是好在,客户端程序更新完是要重启的,一切都烟消云散了~对于删除不掉ZIP文件的问题,我也流氓一下~用DEL硬删除~此处一定要注意!
Process process = Runtime.getRuntime().exec("cmd /c del f:\\aaa.doc");
这样的调用是没有问题~
Process process = Runtime.getRuntime().exec("del f:\\aaa.doc");
这样写是不可能对的~
用Java调用Dos命令时直接用以下命令就可以完成:
String command="ping 192.168.1.1"Runtime.getRuntime().exec(command);
并可以使用Process类的getInputStream()方法获取输出结果,但是,我在调用一些工具软件的Dos命令时却出现了问题,输出结果只能取到前面一小部分,经测试发现,exec(command)之后没多久,Java就认为这个进程结束了,并立即开始执行下面的操作,但这时command实际上并没有结束,但由于流的关闭而被迫中断。
后来用了同事介绍的方法,将这些Dos命令全部放在一个批处理文件当中,并用
String command="cmd /c start d:\\wmv.bat"
的方法来调用(如果不加cmd /c的话,执行同样会出错),这样一来,Java只是新起了一个进程去执行批处理,并不会去管进程是否结束,而是直接开始执行下面的语句。
但这样还是有一个问题,就是Java和这个批处理没法进行交互,我试过了Process中的existValue()及waitFor()方法(都是网上说可用来判断进程是否结束的方法),但都起不到作用,往往是进程已经结束了,但Java还认为没结束,或者干脆是Java认为结束了,但进程却实际还在运行着。
分享到:
相关推荐
Java的平台无关性让Java成为编写网络应用程序的佼佼者,而且Java也提供了许多以网络应用为核心的技术,使得Java特别适合于网络应用软件的设计与开发
【标题】"用Java编写的OA系统"是一个基于Web的办公自动化系统,它利用了多种Java技术和框架,为用户提供了一套完整的解决方案。该系统旨在提高工作效率,实现无纸化办公,促进信息共享,并且适用于各种组织机构。 ...
【标题】:“java编写的图片浏览器” 在Java编程领域,创建一个图片浏览器是一个常见的实践,它可以帮助用户方便地浏览和管理计算机上的图像文件。这个特定的项目是一个基于Java的图片查看器,允许用户通过点击“上...
"JAVA编写"表明它是用Java语言实现的,这涉及到Java的基础语法、面向对象编程概念,以及可能使用的JavaFX或Swing库来构建图形用户界面;"程序"则指的是这个完整的可执行项目,它是一个能够独立运行的软件。 【压缩...
【标题】:“java编写的记事本” 在IT领域,编程语言Java被广泛应用于各种软件开发,包括桌面应用。这个“java编写的记事本”项目就是一个实例,它利用Java的强大功能来实现基本的文本编辑操作,类似于我们常见的...
本应用程序的主题聚焦于使用Java来处理数据,包括从数据库和XML文件中读取以及写入数据。这两种数据存储方式在现代软件系统中扮演着至关重要的角色。 首先,让我们深入了解一下数据库操作。Java通过JDBC(Java ...
用下拉框编写各类货币的兑换。给定货币兑换率。
Java编程语言是软件开发领域广泛使用的工具,尤其适合构建各种类型的应用系统,包括简单的系统。在本主题中,我们将深入探讨如何使用Java来编写一个简单的系统。首先,我们需要理解Java的基础,包括语法、类与对象、...
Java编写的MP3播放器是一种基于Java编程语言开发的软件应用,主要用于播放音频文件,特别是MPEG音频层3(MP3)格式的音乐。在Java中实现MP3播放功能涉及多个核心技术和组件,下面将详细阐述相关的知识点。 1. **...
"使用JAVA编写网络通信程序" 网络通信程序的基本概念 在客户/服务器模式中,服务器端负责数据和图像等的存储、维护、管理以及传递,而客户端则负责人机界面的操作、送出需求及显示收回的数据。在这种模式下,...
【Java编写手机应用程序】 在移动通信领域,Java已经成为开发手机应用程序的重要语言,尤其对于早期的智能手机和平板设备。本文主要探讨如何使用Java来编写手机应用程序,以满足用户对多功能、便携式设备的需求。 ...
本实验的目的是设计一个使用 Java 语言编写的转动小风扇程序,可以实现加速、减速、变换转动方向和暂停等功能。该程序使用 Java 软件编程实现小风扇的模拟,并提供了一个用户友好的界面,用户可以通过按钮来控制小...
在本项目中,我们讨论的是一个使用Java编程语言编写的简单聊天室应用程序。这个应用程序旨在模拟客户端和服务器端之间的通信,让多个用户可以实时交流。下面我们将深入探讨这个项目的相关知识点。 1. **Java基础**...
综上所述,这个“java编写的小程序”是一个使用Java语言并借助MyEclipse IDE开发的3D应用。它可能包含3D模型的创建、渲染和交互,而“ticket3d”可能是程序中的关键组件,负责处理3D环境中的某些特定逻辑或数据。...
总的来说,这个Java编写的金山打字模拟程序涵盖了Java GUI编程、文本处理、错误检测、速度统计等多个技术点,对于学习和实践Java应用开发是非常有价值的。开发者可以通过此项目锻炼面向对象设计、事件处理和用户界面...
在这个场景中,我们关注的是一个特定的项目——一个用Java编写的科学计算器。科学计算器不仅具备基本的四则运算,还提供更高级的数学功能,如对数、指数、三角函数、复数运算等,对于学习者和专业人士来说非常实用。...
总之,这个用Java编写的日历实例是一个综合性的编程项目,涵盖了基础的日期时间处理、事件驱动编程和GUI设计。通过实践这个项目,你将能够巩固并提升你的Java技能。在实际编码时,建议参考Java官方文档和在线教程,...
【标题】"用JAVA编写的物流网站的源代码"提供了我们深入探讨JAVA在构建物流网站中的应用的机会。JAVA,作为一种广泛使用的编程语言,以其面向对象的特性、平台无关性以及丰富的类库,常被用于开发复杂的Web应用程序...
一个用JAVA编写的俄罗斯方块的应用程序,有很好的界面