java 调用window程序_Windows下Java调用可执行文件代码实例
这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
缘起:
由于没有找到java转换文件的接口,因此使用java调用exe文件进行文件转换
public void convertFile(){
Runtime rn = Runtime.getRuntime();
Process p =null;
try{
p = rn.exec("D:/convert/Convert.exe D:/convert/my.ifc D:/convert/tmp.dae");
}catch (Exception e){
e.printStackTrace();
}
}
调用这个方法,就可以实现文件的转换了,和在命令窗口执行的结果一样
获取执行结果
public void convertFile(){
Runtime rn = Runtime.getRuntime();
Process p =null;
try{
p = rn.exec("D:/convert/Convert.exe D:/convert/my.ifc D:/convert/tmp.dae");int exitVal = p.waitFor();
if (exitVal == 0) {
System.out.println("转换成功.");
} else {
System.out.println( "转换失败.");
}
}catch (Exception e){
e.printStackTrace();
}finally {
p.destroy();
}
}
注:
安全编码规范中都会指出:使用Process.waitfor的时候,可能导致进程阻塞,甚至死锁
出现挂起的原因为:可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。
1.主进程中调用Runtime.exec会创建一个子进程,用于执行程序。子进程创建后会和主进程分别独立运行
2.主进程需要等待脚本执行完成,然后对执行程序返回值或输出进行处理,所以这里主进程调用Process.waitfor等待子进程完成
3.子进程执行过程就是不断的打印信息。主进程中可以通过Process.getInputStream和Process.getErrorStream获取并处理
4.子进程不断向主进程发生数据,而主进程调用Process.waitfor后已挂起。当前子进程和主进程之间的缓冲区塞满后,子进程不能继续写数据,然后也会挂起
5.子进程等待主进程读取数据,主进程等待子进程结束,两个进程相互等待,最终导致死锁
解决的办法是,利用Java中Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。
优化代码
public void convertFile(){
Runtime rn = Runtime.getRuntime();
Process p =null;
try{
p = rn.exec("D:/convert/Convert.exe D:/convert/my.ifc D:/convert/tmp.dae");
InputStream stdin = p.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
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 = p.waitFor();
if (exitVal == 0) {
System.out.println("转换成功.");
} else {
System.out.println( "转换失败.");
}
}catch (Exception e){
e.printStackTrace();
}finally {
p.destroy();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java 调用window程序_Windows下Java调用可执行文件代码实例相关推荐
- java实现redis客户端_windows下java swt实现操作redis的客户端工具
redisclient 1.0 正式发布,适用于多个 Redis 版本,主要更新内容如下: 1.管理 Redis 服务器 2.管理 Redis data favorite 3.管理 Redis 数据 ...
- Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统
Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统 public Swingtest002() {// 设置标题setTitle("请 ...
- java实现语音发送,Java实现发送手机短信语音验证功能代码实例
这篇文章主要介绍了java实现发送手机短信语音验证功能代码实例,www.cppcns.com文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 利用第三方 ...
- 基于java的圆通快递单号自动识别api接口代码实例
一.产品介绍 快递单号识别,输入运单号自动识别物流公司,实时返回对应物流公司编码.查询单号时,返回的结果可能存在一个或多个物流公司编码,快递鸟大数据平台通过智能分析,实时更新单号库,保障物流公司编码准 ...
- python控制软件点击_Python小程序 控制鼠标循环点击代码实例
Python小程序 控制鼠标循环点击代码实例 这篇文章主要介绍了Python小程序 控制鼠标循环点击代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以 ...
- java windows so文件_windows下编译使用NDK,调用SO文件 | 学步园
下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令. 这里以D:\ndk\samples\hello-jni为例,打开D:\ndk\samples\ ...
- window如何杀掉java进程_windows下java -jar 后台运行以及杀死后台进程的操作
在你的jar文件当前目录中建立一个bat文件: 内容是:注意文件名要对应 @echo off START "commandServer" javaw -jar command-0. ...
- linux c++ 调用matlab,ubuntu系统下C++调用matlab程序的方法详解
前言 最近因为工作的需要在研究C++怎么调用matlab程序,发现网上的资料较少,所以将自己学习的内容总结分享出来,下面话不多说了,来一起看看详细的介绍吧. 实验平台: ubuntu matlab ...
- java tar 安装程序_linux下jdk的安装(tar包)
1.查看jdk安装路径 [root@localhost ~]# whereis java java: /usr/bin/java /etc/java /usr/lib/java /usr/share/ ...
最新文章
- 面试官:MySQL 表设计要注意什么?
- Sass-也许你想和CSS玩耍起来(上篇)
- tomcat8配置tomcat-users.xml不生效
- python基础:序列(列表、元组、字符串)、函数、字典、集合
- pov-inc_yourself劳自己-懒惰的设计师的POV和一些Figma
- C++ 构建最小堆、最大堆
- Material Design综合实例
- python类的属性和对象属性_Python打印对象的全部属性
- (23)ISE14.7 PLL输出时钟不能直接输出到普通IO(FPGA不积跬步101)
- 最困难的是带着自己的选择生活下去
- Phpcms V9 栏目列表调用文章点击量及评论数量方法(转)
- linux vsftpd 配置及使用详解
- 调试神器SEGGER_RTT移植使用
- 92年程序员发帖晒薪资称自己很迷茫,网友:老弟你可以了
- 实际使用Windows 7中的Readyboost功能
- pyinstaller打包指南,No module named xxx,is only available if OpenCV is installed.虚拟环境打包
- ICCAD 2020,我们来了!
- D. Deleting Divisors
- Adrealm:区块链的“快慢之道”|金色财经独家专访
- [C]qsort的使用和实现