原文出处:http://blog.csdn.net/muiltmeta/archive/2002/05/08/16660.aspx
前一段时间看了《程序员》第
3
期
Java
专家门诊中怎样调用其它的程序,我把其解答代码放到一个程序中,如下示:
<o:p>
</o:p>
import java.lang.*;<o:p>
<o:p>
public class runProg{<o:p>
public static void main(String[] args){<o:p>
try{<o:p>
Runtime rt=Runtime.getRuntime();<o:p>
rt.exec("NotePad");<o:p>
}catch(Exception e){}<o:p>
}<o:p>
}
|
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
在命令符下编译运行,直接调用了记事本应用程序,没有任何问题。
<o:p>
</o:p>
但在图形用户的应用程序中,就不能编译,代码示例如下:
<o:p>
</o:p>
void jButton1_actionPerformed(ActionEvent e) { <o:p>
//
下是解答代码
try{<o:p>
Runtime rt=Runtime.getRuntime();<o:p>
rt.exec("NotePad");<o:p>
}catch(Exception e){<o:p>
}
//
上是解答代码
<o:p>
</o:p>
}
|
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
<o:p>
就上面的代码而言,只是说明了调用其它程序的基本方法,但是这段代码根本不能被编译过去,在
Jbuilder
中的编译错误如下:
"Frame2.java":
Error #: 469 : variable e is already defined in method
jButton1_actionPerformed(java.awt.event.ActionEvent) at line 50, column
18
|
<o:p>
<o:p>
<o:p>
<o:p>
看到这个编译错误也许认为是按钮的事件定义错误,实际上是
AWT
中
Component
的事件是线程安全级的,不允许直接使用另外进程或线程,因
Swing
中的组件是从
AWT
中继承来的,所以也不允许直接使用。解决办法只有使用一个新线程。代码如下示:
void jButton1_actionPerformed(ActionEvent e) {<o:p>
//must be use a new thread.<o:p>
Thread t = new Thread(new Runnable(){<o:p>
public void run(){<o:p>
try {<o:p>
Runtime rt = Runtime().getRuntime();<o:p>
rt.exec(“notepad”);<o:p>
} catch (IOException e) {<o:p>
System.err.println("IO error: " + e);<o:p>
}<o:p>
}<o:p>
});<o:p>
t.start();<o:p>
<o:p>
}
但是这段代码还是不能被编译,错误提示如下:
"Frame1.java":
Error #: 300 : method Runtime() not found in anonymous class of method
jButton1_actionPerformed(java.awt.event.ActionEvent) at line 74, column
22
。
|
<o:p>
<o:p>
<o:p>
<o:p>
看到这段代码,认为没有发现
Runtime()
,或者没有包含
Runtime
所在的包。但实际上是
java
每个
Application
都有一个自己的
Runtime
,所以不允许显式声明和使用另外一个。其实,许多文章也都是这么介绍的。在这里必须使用
Process
来启用另外一个进程使用
Runtime
。代码示例如下:
void jButton1_actionPerformed(ActionEvent e) {<o:p>
//must be use a new thread.<o:p>
Thread t = new Thread(new Runnable(){<o:p>
public void run(){<o:p>
try {<o:p>
//String[] arrCommand = {"javaw", "-jar", "d:/Unicom/Salary/Salary.jar"};
// Process p = Runtime.getRuntime().exec(arrCommand);<o:p>
Process p = Runtime.getRuntime().exec("notepad");<o:p>
p.waitFor();<o:p>
System.out.println("return code: " + p.exitValue());<o:p>
} catch (IOException e) {<o:p>
System.err.println("IO error: " + e);<o:p>
} catch (InterruptedException e1) {<o:p>
System.err.println("Exception: " + e1.getMessage());<o:p>
}<o:p>
}<o:p>
});<o:p>
t.start();<o:p>
<o:p>
}
运行后,点击
jButton1
调用了
Windows
中的记事本应用程序。这里,新线程使用了
Runnable
接口,这是一种常用的技巧。另外,还必须要捕获
IOException
和
InterruptedException
两个异常。对于调用带有参数的复杂程序,要使用字符串数组代替简单的字符串,我在上面的代码注释了。
分享到:
相关推荐
java中两种方式调用其他.exe可执行程序
简单的java程序,包含调用控制台,调用wget,内含wget.exe及相关使用手册
在Java程序中调用Matlab函数,介绍了在java中怎样调用matlab函数来进行矩阵的分析操作
java中调用kettle中的job与转换源码,其中kettle用的是5.2.0.0的版本。已经测试过可以调用访问,并且可以传入参数调用。有需要的可直接拿去使用。
如何在JAVA中调用windows_API
解决Java新建进程问题 Java调用应用程序 可以学会如何使用Java的Runtime类的exec
是java程序调用windows中的应该程序的例子, 大家可以可以参考一下.
LibSVM Java API调用示例程序 Eclipse 完整工程可以运行 相关详情见http://blog.csdn.net/yangliuy/article/details/8041343#comments 3行程序搞定SVM分类-用JAVA程序调用LibSVM API 最简单的示例 欢迎关注我的博客...
在java中调用C语言的函数,对初学者很不错的实例! 在java中调用C语言的函数,对初学者很不错的实例!
Java程序调用存储过程 Java程序调用存储过程 Java程序调用存储过程 Java程序调用存储过程 Java程序调用存储过程
Java程序调用MATLAB接口
Java程序中调用存储过程,数据库创建存储过程
在java中调用训练好的TensorFlow模型1
java web调用exe
在Java中想要调用python程序,可以加入python的依赖包。 Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。...
利用Jacob库从java调用c# dll的样例程序,实现了从java调用c# dll的简单方案,供大家学习参考。
Dubbo调用java接口程序
独家开发pos机调用程序开发,基于jdk1.8开发,主要技术难点为集成调用dll库的maven项目,参考价值一为java调用dll库函数开发,一为银联pos机调用
java调用c c++程序实例,java用eclipse编译,c/c++用visual studio2008编译。
如何在JAVA中调用windows_API.doc 如何在JAVA中调用windows_API.doc