`
wanjianfei
  • 浏览: 306826 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java调用批处理或可执行文件

    博客分类:
  • J2SE
阅读更多

Java调用批处理或可执行文件

用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式:
...

Processprocess=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:\\ProgramFiles\\MicrosoftOffice\\office\\winword.exe.\\a.doc");


显然,前一种方法更为简捷方便。
3、执行一个有标准输出的DOS可执行程序
在windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java提供的Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:
...

Stringls_1;
Processprocess
=Runtime.getRuntime().exec("cmd/cdir\\windows"
);
BufferedReaderbufferedReader
=new
BufferedReader(\
new
InputStreamReader(process.getInputStream());
while((ls_1=bufferedReader.readLine())!=null
)
System.out.println(ls_1);

process.waitfor();


今天在做客户端程序的自动更新,简单描述一下,就是从服务器上将更新包下载下来,然后在本地解压缩,最后删掉~功能很简单~

但是问题出在使用JAVA的ZIP模块做文件的解压缩不是想象的那么简单,资源需要释放,一个不小心就没有办法删除掉原有ZIP文件了~资源的占用确实是个大问题,但是好在,客户端程序更新完是要重启的,一切都烟消云散了~对于删除不掉ZIP文件的问题,我也流氓一下~用DEL硬删除~此处一定要注意!

Processprocess=Runtime.getRuntime().exec("cmd/cdelf:\\aaa.doc");


这样的调用是没有问题~

Processprocess=Runtime.getRuntime().exec("delf:\\aaa.doc");


这样写是不可能对的~
用Java调用Dos命令时直接用以下命令就可以完成:

Stringcommand="ping192.168.1.1";
Runtime.getRuntime().exec(command);

并可以使用Process类的getInputStream()方法获取输出结果,但是,我在调用一些工具软件的Dos命令时却出现了问题,输出结果只能取到前面一小部分,经测试发现,exec(command)之后没多久,Java就认为这个进程结束了,并立即开始执行下面的操作,但这时command实际上并没有结束,但由于流的关闭而被迫中断。

后来用了同事介绍的方法,将这些Dos命令全部放在一个批处理文件当中,并用

Stringcommand="cmd/cstartd:\\wmv.bat"


的方法来调用(如果不加cmd /c的话,执行同样会出错),这样一来,Java只是新起了一个进程去执行批处理,并不会去管进程是否结束,而是直接开始执行下面的语句。

但这样还是有一个问题,就是Java和这个批处理没法进行交互,我试过了Process中的existValue()及waitFor()方法(都是网上说可用来判断进程是否结束的方法),但都起不到作用,往往是进程已经结束了,但Java还认为没结束,或者干脆是Java认为结束了,但进程却实际还在运行着。

分享到:
评论

相关推荐

    java执行可执行文件或批处理

    java执行可执行文件或批处理 java执行可执行文件或批处理

    Java如何调用可执行文件和批处理命令.doc

    Java如何调用可执行文件和批处理命令

    java 调用windows的一些可执行文件

    java可以调用windows的一些可执行文件,批处理呀之类的,这里是提供的一个例子

    Linux服务器批处理远程命令执行工具

    Linux服务器批处理远程命令执行工具。纯java实现的ssh协议(jsch),支持同时连接多台linux主机,执行相同的命令。...服务器无需配置ssh对等协议或安装任何agent插件...并发命令执行,可配置顺序或随机(阻塞)返回执行结果

    Spring.Batch批处理框架

    Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使得已经使用 Spring 框架的开发者或者企业更容易访问和利用企业服务。 Spring Batch 提供了大量可重用的组件,包括了日志、追踪、事务、...

    换器也兼容其他多版本的JAVA程序,比如S40手机的JAVA程序

    【执行程序 Midp2Exe.exe】是一个DOS可执行文件,需要在DOS环境下执行,对没有DOS使用经验的人来说,操作起来会比较吃力。 【数据库文件 MidpRuntimeDLL.dll】是重要的主程序文件,执行程序就是调用这个文件来模拟...

    多道批处理的两级调度.zip

    多道批处理的两级调度的模拟器,用java,swing,JFormDesigner编写,并生成了可执行文件,供学习操作系统处理机算法的同学使用。请放心使用!

    java jdk实列宝典 光盘源代码

    使用PreparedStatement,动态执行sql语句,UsingPreparedStatement.java; 读写二进制数据,BinaryData.java; 读写Blob数据,blob数据常以二进制形式存储比较大的文件数据,如图片、视频文件等,本文介绍如何往...

    Java项目开发与毕业设计指导

    bin——bin目录包含了Aglet平台所有的可执行程序,比如掌控接收Agent的后台(daemon)程序,另外bin目录还包含了进一步安装需要的文件。 cnf——cnf目录包含了Aglet平台的配置文件。 public——public目录包含了...

    java打包为exe

    制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法。 Java 程序是由若干个 .class 文件组成的。这些 .class 文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录...

    jar程序转化为exe

    jar转exe转换器(jar2exe)是一款可以将jar文件转换成exe可执行文件的工具。采用Java开发的软件更加方便地执行和发布,避免了采用批处理文件进行启动带来的麻烦。jar2exe的工作原理就是使用JNI接口启动java虚拟机,并...

    SQL数据库连接器(Java版)

    注意:我在压缩包里写了一个批处理文件,文件作用是打开数据库连接程序,在Windows系统下使用时,首先执行批处理文件。出现画面一闪的情况,是批处理文件运行时显现的CMD窗口。程序没有运行起来,因该是计算机上的...

    minecraft-server-ping-tracker:我编写的批处理文件旨在使用https跟踪给定的服务器

    我编写的批处理文件旨在使用和Curl跟踪给定的服务器 这仅适用于Windows 10 注意:适用于1.6或更高版本且可ping通的服务器。 将用于与ping API交互的实际PHP脚本,并将入用于运行Ping APIPHP可执行文件。 PHP脚本。...

    代码行统计(可以对C\C++、Java的源代码进行统计,统计结果包括:总行数、空行数、注释行数和代码行数,统计结果可以以表格的形式显示给用户或另存为文件)

    代码行统计工具用Java语言实现,可以对C\C++、Java的源代码进行统计,统计结果包括:总行数、空行数、注释行数和代码行数,统计结果可以以表格的形式显示给用户或另存为文件。 一 执行环境: 操作系统:WindowsNT/...

    JAVA 范例大全 光盘 资源

    实例101 使用ProcessBuilder调用外部命令 263 实例102 监控管理虚拟机 267 第12章 XML开发.. 273 实例103 HTML文件转成XML文件 273 实例104 XML文件转成HTML文件 275 实例105 DOM4j解析XML文件 278 实例106 ...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    update_javapath.bat

    Kettle之修改Java环境变量的批处理代码,默认使用JDK路径C:\Program Files\Java\jdk1.7.0_71。可随意替换为其他JDK版本。要以管理员方式运行命令,不然提示拒绝执行命令的提示。  @echo off 是关闭回显的,不会...

    Windows Bat脚本-快速切换Java版本

    该批处理脚本允许用户在多个JDK版本之间进行切换,并设置所选版本的JAVA_HOME环境变量,以便用户可以轻松切换不同的Java开发环境。 实现细节: 获取管理员权限: 在脚本开头,使用mshta命令获取管理员执行权限,...

Global site tag (gtag.js) - Google Analytics