这篇文章主要介绍了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调用可执行文件代码实例相关推荐

  1. java实现redis客户端_windows下java swt实现操作redis的客户端工具

    redisclient 1.0 正式发布,适用于多个 Redis 版本,主要更新内容如下: 1.管理 Redis 服务器 2.管理 Redis data favorite 3.管理 Redis 数据 ...

  2. Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统

    Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统  Java即时通讯 Java聊天系统 public Swingtest002() {// 设置标题setTitle("请 ...

  3. java实现语音发送,Java实现发送手机短信语音验证功能代码实例

    这篇文章主要介绍了java实现发送手机短信语音验证功能代码实例,www.cppcns.com文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 利用第三方 ...

  4. 基于java的圆通快递单号自动识别api接口代码实例

    一.产品介绍 快递单号识别,输入运单号自动识别物流公司,实时返回对应物流公司编码.查询单号时,返回的结果可能存在一个或多个物流公司编码,快递鸟大数据平台通过智能分析,实时更新单号库,保障物流公司编码准 ...

  5. python控制软件点击_Python小程序 控制鼠标循环点击代码实例

    Python小程序 控制鼠标循环点击代码实例 这篇文章主要介绍了Python小程序 控制鼠标循环点击代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以 ...

  6. java windows so文件_windows下编译使用NDK,调用SO文件 | 学步园

    下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令. 这里以D:\ndk\samples\hello-jni为例,打开D:\ndk\samples\ ...

  7. window如何杀掉java进程_windows下java -jar 后台运行以及杀死后台进程的操作

    在你的jar文件当前目录中建立一个bat文件: 内容是:注意文件名要对应 @echo off START "commandServer" javaw -jar command-0. ...

  8. linux c++ 调用matlab,ubuntu系统下C++调用matlab程序的方法详解

    前言 最近因为工作的需要在研究C++怎么调用matlab程序,发现网上的资料较少,所以将自己学习的内容总结分享出来,下面话不多说了,来一起看看详细的介绍吧. 实验平台: ubuntu  matlab ...

  9. java tar 安装程序_linux下jdk的安装(tar包)

    1.查看jdk安装路径 [root@localhost ~]# whereis java java: /usr/bin/java /etc/java /usr/lib/java /usr/share/ ...

最新文章

  1. 面试官:MySQL 表设计要注意什么?
  2. Sass-也许你想和CSS玩耍起来(上篇)
  3. tomcat8配置tomcat-users.xml不生效
  4. python基础:序列(列表、元组、字符串)、函数、字典、集合
  5. pov-inc_yourself劳自己-懒惰的设计师的POV和一些Figma
  6. C++ 构建最小堆、最大堆
  7. Material Design综合实例
  8. python类的属性和对象属性_Python打印对象的全部属性
  9. (23)ISE14.7 PLL输出时钟不能直接输出到普通IO(FPGA不积跬步101)
  10. 最困难的是带着自己的选择生活下去
  11. Phpcms V9 栏目列表调用文章点击量及评论数量方法(转)
  12. linux vsftpd 配置及使用详解
  13. 调试神器SEGGER_RTT移植使用
  14. 92年程序员发帖晒薪资称自己很迷茫,网友:老弟你可以了
  15. 实际使用Windows 7中的Readyboost功能
  16. pyinstaller打包指南,No module named xxx,is only available if OpenCV is installed.虚拟环境打包
  17. ICCAD 2020,我们来了!
  18. D. Deleting Divisors
  19. Adrealm:区块链的“快慢之道”|金色财经独家专访
  20. [C]qsort的使用和实现

热门文章

  1. 协程与线程, 进程的区别
  2. python测试题 --- 列表元素处理
  3. pycharm中的数据库可视化
  4. Native App
  5. Ajax实现页面加载等待
  6. 深度学习《各种归一化的区别》
  7. 《Pytorch - CNN模型》
  8. 深度学习《CNN架构》
  9. python typing与之配合_python 代码实例1
  10. 去哪儿-03-index-swiper