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();
}
}
}
分享到:
相关推荐
- 使用`javac`命令尝试编译一个简单的Java程序,确保编译器正确工作。 #### 二、Java变量与运算符 **2.1 变量** - 变量是用来存储数据的容器。 - 每个变量都有一个特定的数据类型,如`int`、`float`、`boolean`等...
安装JDK 8u201时,首先要解压缩这个rar文件,得到可执行文件"jdk-8u201-windows-x64.exe"。双击运行这个安装程序,按照向导的指示完成安装过程。安装过程中,可以选择安装路径,一般默认即可。同时,为了使系统能够...
在本例中,我们关注的是"Lombok-plugin-0.29-2019.3.zip",这是一个针对IntelliJ IDEA 2019.03版本的Lombok插件。 **Lombok插件介绍** Lombok插件是IntelliJ IDEA中用于支持Lombok库的扩展工具。这个插件使得IDE...
1. **空指针异常(NullPointerException)**:这是Java中最常见的错误之一,通常是由于尝试访问一个null对象的方法或属性时抛出。避免这种错误的方法是在使用对象之前检查它是否为null。 2. **数组越界异常...
本压缩包“mysql驱动jar包5.1.46.zip”包含了MySQL官方驱动的5.1.46版本,这是一个稳定且广泛使用的版本,适用于许多基于Java的数据库应用。 `mysql-connector-java-5.1.46.jar` 是这个压缩包的核心文件,它是MySQL...
首先,我们需要打开一个DFA文件,例如ADD_TRAP.jff,这是JFLAP的文件格式,包含了DFA的结构和转移规则。在JFLAP的菜单栏上选择“Convert → Add Trap State to DFA”,这将启动添加陷阱状态的流程。 接下来,我们...
4. **查看 Java 源码**:接着,使用JD-GUI(jd-gui.exe)来打开新生成的.jar文件。JD-GUI会显示反编译后的Java源代码,尽管它可能不会完全与原始代码一致,但足够理解大部分逻辑。 5. **解析资源文件**:APK中的res...
- 在系统变量中新建一个变量,变量名为`CLASSPATH`,变量值设置为`.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar`。 - 请注意,开头的小点(`.`)表示当前目录,是必不可少的。 - 保存所有更改...
- 阅读:解压后的MIB文件可以用文本编辑器打开,理解其中的对象标识符(OID)和它们对应的网络设备属性。 - 配置SNMP代理:在惠普设备上配置SNMP服务,确保其支持读取和更新MIB库中的信息。 - 使用SNMP工具:利用...
《SDO_SDO的JAVA实现规范》:深入解析与应用 ...总之,“SDO_SDO的JAVA实现规范”不仅是一份技术文档,更是连接理论与实践的桥梁,它为Java开发者打开了一个全新的数据操作世界,助力他们在复杂的数据环境中游刃有余。
11. **Thread类的位置** - Thread类位于java.lang包中,这是Java基础类库的一部分。 12. **Word段落格式** - 在Word中,段落可以根据设定的页边距自适应调整,描述正确。 13. **线性链表** - 线性链表的存储空间不...
例如,`ArrayList`类是`java.util`包中的一个动态数组实现,可以方便地添加、删除和查找元素。 3. **接口(Interfaces)**:接口定义了一组方法的签名,但不提供具体的实现。类可以实现接口,从而承诺实现接口中...
Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该...
- **安全性**:Kotlin 设计时考虑了常见的 Java 陷阱,例如空指针异常,它提供了一种更安全的方式来处理这些问题。 - **简洁性**:相比于 Java,Kotlin 代码更加简洁,可以减少样板代码的数量,提高开发效率。 - **...
- 避免了NIO的陷阱:Netty内部处理了epoll空轮询的问题,避免了NIO操作中的一个常见陷阱。 在Netty的使用过程中,开发者需要理解这些基础知识,尤其是在处理IO密集型和高并发的应用时,理解这些知识点对于设计高效...
在Ubuntu 18.00系统中安装MySQL 5.7是一个相对标准的过程,但需要注意一些潜在的问题和陷阱。以下是一份详细的安装指南,确保你在安装过程中无坑: 1. **确认MySQL未安装**: 在开始安装之前,你需要确认系统中...
Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。这个"poi 3.2 jar包+实例代码解决方案"的资源集合提供了使用Apache POI 3.2版本来操作Excel文件所需的一切。在这...
18. LinkedList在Java中是一个双向链表,每个元素节点确实包含前后元素的引用。 19. HTML单元格的背景颜色可以通过CSS的`background-color`属性设置。 20. 子类能继承父类的所有方法和状态,无论是否私有,但在...
1. 打开Eclipse,创建一个新的Android工程。 2. 新建一个名为`jni`的文件夹,用于存放C/C++代码。 #### 四、配置C/C++项目 1. 在项目名称上右键,选择“New” -> “Other”,找到并选择“Convert to C/C++ Project...
Cocos2d-x是一个开源的游戏开发框架,广泛应用于移动平台,如Android和iOS。由于其跨平台的特性,开发者可以编写一次代码,然后在多个平台上运行。然而,配置cocos2d-x的开发环境并不总是一帆风顺,尤其对于新手来说...