最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

JAVA调用DOS命令

来源:动视网 责编:小OO 时间:2025-09-24 11:05:10
文档

JAVA调用DOS命令

JAVA调用DOS命令1、在调用DOS命令后可以让Java程序阻塞,直到命令执行完毕。2、可以获得DOS命令的标准输出和错误输出3、解决了如何执行类似dir这样的DOS内部命令的问题。Runtime这个类里面的exec方法,传入一个命令行,返回一个Process对象,Process代表该命令所产生的进程,可以通过调用Process对象的waitFor方法阻塞当前的Java线程,直到命令执行完毕,但是必须注意的是。如果该命令是有标准输出或者是错误输出的话,必须在waitFor方法阻塞之前,通过读
推荐度:
导读JAVA调用DOS命令1、在调用DOS命令后可以让Java程序阻塞,直到命令执行完毕。2、可以获得DOS命令的标准输出和错误输出3、解决了如何执行类似dir这样的DOS内部命令的问题。Runtime这个类里面的exec方法,传入一个命令行,返回一个Process对象,Process代表该命令所产生的进程,可以通过调用Process对象的waitFor方法阻塞当前的Java线程,直到命令执行完毕,但是必须注意的是。如果该命令是有标准输出或者是错误输出的话,必须在waitFor方法阻塞之前,通过读
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");

这样写是不可能对的~

文档

JAVA调用DOS命令

JAVA调用DOS命令1、在调用DOS命令后可以让Java程序阻塞,直到命令执行完毕。2、可以获得DOS命令的标准输出和错误输出3、解决了如何执行类似dir这样的DOS内部命令的问题。Runtime这个类里面的exec方法,传入一个命令行,返回一个Process对象,Process代表该命令所产生的进程,可以通过调用Process对象的waitFor方法阻塞当前的Java线程,直到命令执行完毕,但是必须注意的是。如果该命令是有标准输出或者是错误输出的话,必须在waitFor方法阻塞之前,通过读
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top