视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JAVA调用DOS命令
2025-09-24 11:05:10 责编:小OO
文档
JAVA调用DOS命令

1、在调用DOS命令后可以让Java程序阻塞,直到命令执行完毕。

2、可以获得DOS命令的标准输出和错误输出

3、解决了如何执行类似dir这样的DOS内部命令的问题。

Runtime这个类里面的exec方法,传入一个命令行,返回一个Process对象,Process代表该命令所产生的进程,可以通过调用Process对象的waitFor方法阻塞当前的Java线程,直到命令执行完毕,但是必须注意的是。如果该命令是有标准输出或者是错误输出的话,必须在waitFor方法阻塞之前,通过读取Process的getErrorStream和getInputStream的内容来捕获所有的标准输出或者是错误输出,要不然,呵呵,调用waitFor的直接结果将不是阻塞当前的Java线程,而是死锁,程序会一直悬挂在那里。

对于象dir这样的DOS内部命令,直接使用Runtime.getRuntime().exec("dir")是会抛出I/O异常的,原因很简单,因为系统中并不存在叫dir的文件,解决办法是使用Runtime.getRuntime().exec("cmd /C dir")。

下面是我包装的一个命令调用的类,贴在这里:

 

package yzq.system;

import java.io.*;

public class Commond extends Thread{

 private String commond = null;

 private String output = null;

 private String error = null;

 private int returnValue = 0;

 

 public Commond(String commond) {

  this.commond = commond;

 }

 

 public void run() {

  StringBuffer outputBuffer = new StringBuffer();

  StringBuffer errorBuffer = new StringBuffer();

  try {

   Process process = Runtime.getRuntime().exec(commond);

   new GetOutput(process.getErrorStream(),errorBuffer).start();

   new GetOutput(process.getInputStream(),outputBuffer).start();

   returnValue = process.waitFor();

   this.output = outputBuffer.toString();

   this.error = errorBuffer.toString();

  } catch (IOException e) {

   returnValue = 65536;

   e.printStackTrace();

  } catch (InterruptedException e) {

   returnValue = -65536;

   e.printStackTrace();

  }

 }

 

 public String getCommond() {

  return commond;

 }

 

 public void setCommond(String commond) {

  this.commond = commond;

 }

 

 public String getError() {

  return error;

 }

 

 public String getOutput() {

  return output;

 }

 

 public int getReturnValue() {

  return returnValue;

 }

 

 public static final void execute(String line) {

  Commond c = new Commond(line);

  System.out.println("StartExec:" + c.getCommond());

  c.run();

System.out.println("");

  System.out.println(c.getOutput());

System.out.println("");

System.out.println("");

  System.out.println(c.getError());

System.out.println("");

System.out.println("");

  System.out.println(c.getReturnValue());

System.out.println("");

  System.out.println("EndExec");

 }

 private static class GetOutput extends Thread {

  InputStream is;

  StringBuffer buffer;

  GetOutput(InputStream is, StringBuffer buffer) {

   this.is = is;

   this.buffer = buffer;

  }

  public void run() {

   try {

    InputStreamReader isr = new InputStreamReader(is);

    BufferedReader br = new BufferedReader(isr);

    String line = null;

    while ((line = br.readLine()) != null) {

     buffer.append(line);

     buffer.append("\\n");

    }

    br.close();

   } catch (IOException ioe) {

    ioe.printStackTrace();

   }

  }

 }

}

之二:

用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");

这样写是不可能对的~下载本文

显示全文
专题