先请编译和运行下面程序:

import java.util.*;

import java.io.*;

public class BadExecJavac2

{

public static void main(String args[])

{

try

{

Runtime rt = Runtime.getRuntime();

Process proc = rt.exec("javac");

int exitVal = proc.waitFor();

System.out.println("Process exitValue: " + exitVal);

} catch (Throwable t){

t.printStackTrace();

}

}

}

我们知道javac命令,当不带参数运行javac 程序时,它将输出帮助说明,为什么上面程序不产生任何输出并挂起,永不完成呢?java文档上说,由于有些本地平台为标准输入和输出流所提供的缓冲区大小有限,如果不能及时写入子进程的输入流或者读取子进程的输出流,可能导致子进程阻塞,甚至陷入死锁。所以,上面的程序应改写为:

import java.util.*;

import java.io.*;

public class MediocreExecJavac

{

public static void main(String args[])

{

try

{

Runtime rt = Runtime.getRuntime();

Process proc = rt.exec("javac");

InputStream stderr = proc.getErrorStream();

InputStreamReader isr = new InputStreamReader(stderr);

BufferedReader br = new BufferedReader(isr);

String line = null;

System.out.println("");

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

System.out.println(line);

System.out.println("");

int exitVal = proc.waitFor();

System.out.println("Process exitValue: " + exitVal);

} catch (Throwable t){

t.printStackTrace();

}

}

}

下面是正确的输出:

D:\java>java   MediocreExecJavac

Usage: javac

where possible options include:

-g                         Generate all debugging info

-g:none                    Generate no debugging info

-g:{lines,vars,source}     Generate only some debugging info

-nowarn                    Generate no warnings

-verbose                   Output messages about what the compiler is doing

-deprecation               Output source locations where deprecated APIs are used

-classpath           Specify where to find user class files

-cp                  Specify where to find user class files

-sourcepath          Specify where to find input source files

-bootclasspath       Override location of bootstrap class files

-extdirs             Override location of installed extensions

-endorseddirs        Override location of endorsed standards path

-d              Specify where to place generated class files

-encoding        Specify character encoding used by source files

-source           Provide source compatibility with specified release

-target           Generate class files for specific VM version

-version                   Version information

-help                      Print a synopsis of standard options

-X                         Print a synopsis of nonstandard options

-J                   Pass directly to the runtime system

Process exitValue: 2

D:\java>

下面是一个更一般的程序,它用两个线程同步清空标准错误流和标准输出流,并能根据你所使用的windows操作系统选择windows命令解释器command.com或cmd.exe,然后执行你提供的命令。

import java.util.*;

import java.io.*;

class StreamGobbler extends Thread

{

InputStream is;

String type;  //输出流的类型ERROR或OUTPUT

StreamGobbler(InputStream is, String type)

{

this.is = is;

this.type = type;

}

public void run()

{

try

{

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

String line=null;

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

{

System.out.println(type + ">" + line);

System.out.flush();

}

} catch (IOException ioe)

{

ioe.printStackTrace();

}

}

}

public class GoodWindowsExec

{

public static void main(String args[])

{

if (args.length < 1)

{

System.out.println("USAGE: java GoodWindowsExec ");

System.exit(1);

}

try

{

String osName = System.getProperty("os.name" );

System.out.println("osName: " + osName);

String[] cmd = new String[3];

if(osName.equals("Windows XP") ||osName.equals("Windows 2000"))

{

cmd[0] = "cmd.exe" ;

cmd[1] = "/C" ;

cmd[2] = args[0];

}

else if( osName.equals( "Windows 98" ) )

{

cmd[0] = "command.com" ;

cmd[1] = "/C" ;

cmd[2] = args[0];

}

Runtime rt = Runtime.getRuntime();

System.out.println("Execing " + cmd[0] + " " + cmd[1]+ " " + cmd[2]);

Process proc = rt.exec(cmd);

// any error message?

StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");

// any output?

StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");

// kick them off

errorGobbler.start();

outputGobbler.start();

// any error???

int exitVal = proc.waitFor();

System.out.println("ExitValue: " + exitVal);

} catch (Throwable t){

t.printStackTrace();

}

}

}

下面是一个测试结果:

D:\java>java  GoodWindowsExec "copy Test.java Test1.java"

osName: Windows XP

Execing cmd.exe /C copy Test.java Test1.java

OUTPUT>已复制         1 个文件。

ExitValue: 0

D:\java>

下面的测试都能通过(windows xp+jdk1.5)

D:\java>java   GoodWindowsExec dir

D:\java>java   GoodWindowsExec Test.java

D:\java>java   GoodWindowsExec regedit.exe

D:\java>java   GoodWindowsExec NOTEPAD.EXE

D:\java>java   GoodWindowsExec first.ppt

D:\java>java   GoodWindowsExec second.doc

客户虐我千百遍,我待客户如初恋!

java程序启动命令_如何用java启动windows命令行程序相关推荐

  1. java中循环输入_如何用java循环输入并且当输入0时结束循环?

    如何用java循环输入并且当输入0时结束循环? import java.util.Scanner; public class Avg { public static void main(String[ ...

  2. java hdfs 新建目录_如何用java在hdfs中创建一个新目录?

    public static void main(String[] args) throws IOException, URISyntaxException { ????????????配置config ...

  3. java绘制矩形 鼠标_如何用java在面板上用鼠标绘制出一个矩形

    展开全部 import java.awt.*; import java.awt.geom.*; import javax.swing.*; import java.awt.event.*; impor ...

  4. java 代码 内存泄露_如何用Java编写一段代码引发内存泄露

    Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码.这个问题我一点思路都没有,好囧. A1:通过以下步骤可以很容易产生内存泄露(程序代码不能访问到某些对象,但是它们仍然保存在内存中) ...

  5. java 制作简易日历_如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  6. 手机java做贪吃蛇_如何用Java写一个贪吃蛇游戏

    这是一位拓胜学员用Java写贪吃蛇游戏的心得:今天课程设计终于结束了自己学java没以前学C+那么用功了觉得我学习在哪里都是个开口向上的抛物线,现在应该在右半边吧,好了进入正题. 写java贪吃蛇也是 ...

  7. 生日在java中怎么写_如何用java写代码:输入自己的生日,距离今天已过多少天,或者还有...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 从新发过 import java.util.*; import java.io.*; public class birthday{ public stat ...

  8. java mysql 输入数据库_如何用JAVA录入数据到SQL数据库

    Java可以使用e68a8462616964757a686964616f31333361326236JDBC对数据库进行读写.JDBC访问一般分为如下流程: 1.加载JDBC驱动程序: 在连接数据库之 ...

  9. java 读取css文件_如何用java解析css文件?

    1.如何更换空间背景? 打开高级设置,再自定义CSS,看到里面的第3行和第4行都是 header div.lc{background:url(header div.lc{background:url ...

最新文章

  1. MySQL中,当 update 修改数据与原数据相同时会再次执行吗?
  2. HTML5 通过 FileReader 实现文件上传
  3. 记录一次redis事故
  4. 前后端分离的项目部署到tomcat_如何在开发时部署和运行前后端分离的JavaWeb项目...
  5. Base 6 FAQ v8
  6. Realme XT发布会PPT曝光:后置6400万四摄+骁龙712
  7. python -day16-模块介绍
  8. axios请求跨域前端解决_Vue-创建axios实例并实现跨域请求(完整过程-前端)
  9. IoT:MQTT协议详解
  10. 问你觉得iOS7为什么要扁平化,扁平化和之前的比有什么优势
  11. paip.解决 数据库mysql增加列 字段很慢添加字段很慢
  12. 判断 失效_复合材料渐进失效Hashin模型及参数详解
  13. 下载——百度文库下载方法
  14. 51单片机c语言轻松入门,单片机的C语言轻松入门资料
  15. pyhon3 爬取河海大学URP教务系统,爬取个人成绩,和本学期的成绩GPA,保存到excel
  16. Windows程序设计-位图和位块传输
  17. Spring IOC介绍
  18. 如我提升自我学习能力
  19. web前端开发小工具集合
  20. relief算法研究

热门文章

  1. UI5控件类似Java反射机制的一个小技巧
  2. SAP CRM text determination调试
  3. CRM Extension field render and property handling
  4. PartnerSet in IBASE
  5. 如何手动删除一个business document和pricing document的relationship
  6. Opportunity的status改为lost后,chance of success仍然为100的原因
  7. How to resolve ATC error message Package Violation (Error) - Missing Use Access (USEM)
  8. 一些使用javap反编译出来的结果分析
  9. Eclipse Java类编辑器里出现乱码的解决方案
  10. hive增量表和全量表_hive 拉链表 实现全量数据 增量更新