`

java陷阱-------用java 打开一个 .exe文件

    博客分类:
  • J2SE
阅读更多
public class Test {
	public static void main(String[] args) {
		Runtime rt = Runtime.getRuntime();
		try {
			Process proc = rt.exec("C:\\Program Files\\Internet Explorer\\iexplore.exe");
			int exitVal = proc.exitValue();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

但是这样允许会出现一个异常:
Exception in thread "Main Thread" java.lang.IllegalThreadStateException: process has not exited
问题原因:
因为程序还没有退出,所以proc.exitValue();程序退出的值当然没有啦。。

怎么改呢。。。

public class Test {
	public static void main(String[] args) {
		Runtime rt = Runtime.getRuntime();
		try {
			Process proc = rt.exec("C:\\Program Files\\Internet Explorer\\iexplore.exe");
			int exitVal = proc.waitFor();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

这里主要是要学习用运行时对象来执行外面的程序。。。

下面换成javac试试
public class Test {
	public static void main(String[] args) {
		Runtime rt = Runtime.getRuntime();
		int exitVal = 0;
		try {
			Process proc = rt.exec("javac");
			exitVal = proc.waitFor();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(exitVal);
	}
}

允许后发现javac死在这里了,因为proc.waitFor一直在等待关闭,而现在javac这样调用的语法有问题,所以这个程序会先输出错误信息再输出退出的val,但是这时候它想输出错误信息都输不出来,所以程序一直挂在这里。。。改的方法就是让错误信息先输出来呀~~~~~~~

public class Test {
	public static void main(String[] args) {
		Runtime rt = Runtime.getRuntime();
		int exitVal = 0;
		try {
			Process proc = rt.exec("javac");
			exitVal = proc.waitFor();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(exitVal);
	}
}
//我改

public class Test {
	public static void main(String[] args) {
		Runtime rt = Runtime.getRuntime();
		int exitVal = 0;
		try {
			Process proc = rt.exec("javac");
			InputStream es = proc.getErrorStream();
			InputStreamReader reader = new InputStreamReader(es);
			BufferedReader br = new BufferedReader(reader);
			StringBuffer sb = new StringBuffer();
			String l = "";
			while((l = br.readLine()) != null){
				sb.append(l+"\n");
			}
			System.out.println(sb.toString());
			exitVal = proc.waitFor();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(exitVal);
	}
}


* 永远要在调用waitFor()方法之前读取数据流
  * 永远要先从标准错误流中读取,然后再读取标准输出流

于是将waitFor()方法放在读取数据流后调用,目前没有发现什么问题。


正好解决了我心中的疑问,非常感谢!

我们的程序一开始就是exec完了接着waitFor(),但bat文件执行不完整:

Process proc = Runtime.getRuntime().exec(cmd);
  proc.waitFor();

后面的build中在waitFor()之前读取了数据流,bat文件就可以完整执行了:

Process proc = Runtime.getRuntime().exec(cmd);
  StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "Error");   
  StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "Output");
  errorGobbler.start();
  outputGobbler.start();

  proc.waitFor();

class StreamGobbler extends Thread {
 InputStream is;

 String type;

 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) {
  if (type.equals("Error"))
  LogManager.logError(line);
  else
  LogManager.logDebug(line);
  }
  } catch (IOException ioe) {
  ioe.printStackTrace();
  }
 }
}



分享到:
评论

相关推荐

    V20-Java笔记整理-重要概念和常见陷阱梳理.docx

    - 使用`javac`命令尝试编译一个简单的Java程序,确保编译器正确工作。 #### 二、Java变量与运算符 **2.1 变量** - 变量是用来存储数据的容器。 - 每个变量都有一个特定的数据类型,如`int`、`float`、`boolean`等...

    jdk-8u201-windows-x64.rar

    安装JDK 8u201时,首先要解压缩这个rar文件,得到可执行文件"jdk-8u201-windows-x64.exe"。双击运行这个安装程序,按照向导的指示完成安装过程。安装过程中,可以选择安装路径,一般默认即可。同时,为了使系统能够...

    lombok-plugin-0.29-2019.3.zip

    在本例中,我们关注的是"Lombok-plugin-0.29-2019.3.zip",这是一个针对IntelliJ IDEA 2019.03版本的Lombok插件。 **Lombok插件介绍** Lombok插件是IntelliJ IDEA中用于支持Lombok库的扩展工具。这个插件使得IDE...

    Java.Bug模式详解.zip

    1. **空指针异常(NullPointerException)**:这是Java中最常见的错误之一,通常是由于尝试访问一个null对象的方法或属性时抛出。避免这种错误的方法是在使用对象之前检查它是否为null。 2. **数组越界异常...

    mysql驱动jar包5.1.46.zip (含导入操作说明)

    本压缩包“mysql驱动jar包5.1.46.zip”包含了MySQL官方驱动的5.1.46版本,这是一个稳定且广泛使用的版本,适用于许多基于Java的数据库应用。 `mysql-connector-java-5.1.46.jar` 是这个压缩包的核心文件,它是MySQL...

    形式语言jflap操作-为DFA增加陷阱状态.pdf

    首先,我们需要打开一个DFA文件,例如ADD_TRAP.jff,这是JFLAP的文件格式,包含了DFA的结构和转移规则。在JFLAP的菜单栏上选择“Convert → Add Trap State to DFA”,这将启动添加陷阱状态的流程。 接下来,我们...

    android 反编译(内附详细使用步骤和所有用到的软件)

    4. **查看 Java 源码**:接着,使用JD-GUI(jd-gui.exe)来打开新生成的.jar文件。JD-GUI会显示反编译后的Java源代码,尽管它可能不会完全与原始代码一致,但足够理解大部分逻辑。 5. **解析资源文件**:APK中的res...

    Java环境变量

    - 在系统变量中新建一个变量,变量名为`CLASSPATH`,变量值设置为`.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar`。 - 请注意,开头的小点(`.`)表示当前目录,是必不可少的。 - 保存所有更改...

    惠普 mib库 upd11.60mib.tar.gz

    - 阅读:解压后的MIB文件可以用文本编辑器打开,理解其中的对象标识符(OID)和它们对应的网络设备属性。 - 配置SNMP代理:在惠普设备上配置SNMP服务,确保其支持读取和更新MIB库中的信息。 - 使用SNMP工具:利用...

    SDO_SDO的JAVA实现规范

    《SDO_SDO的JAVA实现规范》:深入解析与应用 ...总之,“SDO_SDO的JAVA实现规范”不仅是一份技术文档,更是连接理论与实践的桥梁,它为Java开发者打开了一个全新的数据操作世界,助力他们在复杂的数据环境中游刃有余。

    2021-2022计算机二级等级考试试题及答案No.15781.docx

    11. **Thread类的位置** - Thread类位于java.lang包中,这是Java基础类库的一部分。 12. **Word段落格式** - 在Word中,段落可以根据设定的页边距自适应调整,描述正确。 13. **线性链表** - 线性链表的存储空间不...

    java帮助文档

    例如,`ArrayList`类是`java.util`包中的一个动态数组实现,可以方便地添加、删除和查找元素。 3. **接口(Interfaces)**:接口定义了一组方法的签名,但不提供具体的实现。类可以实现接口,从而承诺实现接口中...

    网管教程 从入门到精通软件篇.txt

    Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该...

    Kotlin-初级篇(一):最详细的环境搭建.pdf

    - **安全性**:Kotlin 设计时考虑了常见的 Java 陷阱,例如空指针异常,它提供了一种更安全的方式来处理这些问题。 - **简洁性**:相比于 Java,Kotlin 代码更加简洁,可以减少样板代码的数量,提高开发效率。 - **...

    10道Java高级必备的Netty面试题!

    - 避免了NIO的陷阱:Netty内部处理了epoll空轮询的问题,避免了NIO操作中的一个常见陷阱。 在Netty的使用过程中,开发者需要理解这些基础知识,尤其是在处理IO密集型和高并发的应用时,理解这些知识点对于设计高效...

    ubuntu安装mysql(1).doc

    在Ubuntu 18.00系统中安装MySQL 5.7是一个相对标准的过程,但需要注意一些潜在的问题和陷阱。以下是一份详细的安装指南,确保你在安装过程中无坑: 1. **确认MySQL未安装**: 在开始安装之前,你需要确认系统中...

    poi 3.2 jar包+实例代码解决方案

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。这个"poi 3.2 jar包+实例代码解决方案"的资源集合提供了使用Apache POI 3.2版本来操作Excel文件所需的一切。在这...

    2021-2022计算机二级等级考试试题及答案No.16812.docx

    18. LinkedList在Java中是一个双向链表,每个元素节点确实包含前后元素的引用。 19. HTML单元格的背景颜色可以通过CSS的`background-color`属性设置。 20. 子类能继承父类的所有方法和状态,无论是否私有,但在...

    基于Opencv的Android图像处理(Eclipse和ndk)环境搭建.docx

    1. 打开Eclipse,创建一个新的Android工程。 2. 新建一个名为`jni`的文件夹,用于存放C/C++代码。 #### 四、配置C/C++项目 1. 在项目名称上右键,选择“New” -> “Other”,找到并选择“Convert to C/C++ Project...

    cocos2d--x环境配置

    Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动平台,如Android和iOS。由于其跨平台的特性,开发者可以编写一次代码,然后在多个平台上运行。然而,配置cocos2d-x的开发环境并不总是一帆风顺,尤其对于新手来说...

Global site tag (gtag.js) - Google Analytics