Java调用Windows批处理或Linux脚本或可执行文件

来源:互联网 发布:剑三五毒成女捏脸数据 编辑:程序博客网 时间:2024/06/05 08:50


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

用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认为结束了,但进程却实际还在运行着。

posted on 2008-01-19 21:18々上善若水々 阅读(6265) 评论(2)  编辑  收藏 所属分类:J2SE



java 调用linux 命令"ls" ".sh"  

2012-04-05 13:05:20|  分类:linux下基本操作 |  标签:java--linux  |字号 订阅


执行shell命令语法如下(显示指定目录下的文件,类似命令依次类推):

Runtime.getRuntime().exec(new String[]{"命令", "参数1", "参数2" });

其中: command参数第一个command[0]为linux命令,command[1].command[2]...其余项为参数  
(在网上找了很多例子,千篇一律,只是发布的作者不同罢了)

例:
/** 在/home/thinking//workplace 目录下创建myTest文件夹*/

Runtime.getRuntime().exec(new String[]{"mkdir", "/home/thinking/workplace/myTest"});

/** 显示thinking 目录下的文件 */

Runtime.getRuntime().exec(new String[]{"ls", "/home/thinking/" });

/** 创建文件 */

Runtime.getRuntime().exec(new String[]{"touch", "/home/thinking//workplace/mytest"});


下面列举一个比较容易理解形式,调用shell脚本:

String[] commands = new String[]{"/home/thinking/helloWorld.sh", "param1", "param2"};

try { Process process = Runtime.getRuntime().exec(command); InputStream im = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(im)); String line = ""; while((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }

上述命令运行了/home/thinking目录下的helloWorld.sh这个脚本,其中param1 和 param2为helloWorld的参数列表,此段代码将输出脚本中echo的信息。



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

 发布时间:2008.01.24 04:36     来源:赛迪网    作者:xyz20003

在java调用exe,com可执行文件和bat,cmd批处理文件
一。运行exe文件

   1. Java JDK里已经提供了调用的方法,不在累赘,代码如下。

    try {
        String command = "notepad";
        Process child = Runtime.getRuntime().exec(command);
    } catch (IOException e) {
    }

二。运行bat(批处理)文件

   1.

import java.io.*;

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("args : " + java.util.Arrays.asList(args));

        try
        {
            String command = args.length == 0 ? "notepad" : args[0];
            Process child = Runtime.getRuntime().exec(command);

            String line = null;
            BufferedReader reader = new BufferedReader(new InputStreamReader(child.getInputStream()));
            while((line = reader.readLine()) != null)
            {
                System.out.println(line);
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }

}

   2. 虽然网上有人说找不到直接执行bat文件的方法,但我使用这种方法似乎也可以达到执行bat文件的效果,原本的希望是看看能从Process中读到什么信息,结果直接把bat文件中的内容按行打印并执行了。
   3. 但因为InputStream一直没有关闭,这个循环变成了一个死循环,不知道如何判断批处理文件何时执行完毕。





原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果七内存满了怎么办 华为p9玩王者卡怎么办 鞋放健身房丢了怎么办 京东商家搞虚假活动怎么办 淘宝买的商品出现质量问题怎么办 买了重复的东西怎么办 借记卡在atm用不了怎么办 淘宝评论视频审核不通过怎么办 京东票据丢了怎么办 开拼多多找不到低价货源怎么办 要是校花追你该怎么办 苏宁自提逾期怎么办 天猫超市有问题怎么办 买的东西质量有问题怎么办 淘宝优惠额度大做不了怎么办 淘宝天猫拒绝退货退款怎么办 u盘变成活动分区怎么办 学生上课纪律差家长老师怎么办 老师管纪律学生打老师怎么办? 淘宝店铺层级排名下降怎么办 网购不支持该地区销售怎么办 分销公司佣金不给业务员怎么办 淘宝买家账号违规了怎么办 王者荣耀打野被队友抢野怎么办 艾肯材料换错了怎么办 淘宝直播粉丝5万怎么办 淘宝直播刚开始好难怎么办 分期乐账号忘记了怎么办 外链多了影响网站排名怎么办 自粘墙纸有气泡怎么办 贴壁纸阴角不力怎么办 自贴墙纸有气泡怎么办 壁纸贴的有起泡怎么办 pos机连接主机失败怎么办 无线pos机连接主机失败怎么办 水墨晕染模板用不了怎么办 申请入驻饿了么失败怎么办 天猫流量大淘宝怎么办 拼多多商家不退款怎么办 苹果手机开流量显示e怎么办 苹果手机有服务流量打不开怎么办