windows下Java调用可执行文件
2023-09-14 09:00:01 时间
缘起:
由于没有找到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("<output>"); while ((line = br.readLine()) != null) System.out.println(line); System.out.println("</output>"); int exitVal = p.waitFor(); if (exitVal == 0) { System.out.println("转换成功."); } else { System.out.println( "转换失败."); } }catch (Exception e){ e.printStackTrace(); }finally { p.destroy(); } }
相关文章
- java怎么调用.asmx_Java调用Webservice(asmx)的例子
- java 调用.asmx_Java调用asmx的一个例子
- java源程序文件扩展名_JAVA源代码的扩展名为( )
- java怎么输出保留两位小数_剖析Java输出怎么保留两位小数「建议收藏」
- java记录访问时间_在java中记录上次访问时间和上次修改时间?
- java启动器_JAVA基础:Java 启动器如何查找类
- 编写java判断闰年_Java 判断闰年代码实例
- setproperty java_Java中System.setProperty()的用法
- JAVA项目集锦 Java项目视频20套
- Java递归写法_java递归调用
- java将字符串分段输出_java输入字符串并将每个字符输出的方法[通俗易懂]
- Java中的屏幕共享
- 关于Java判断字符串相等的常见问题
- 浅谈Java 8的新特性和使用场景详解编程语言
- Java Arrays类进行数组排序详解编程语言
- java多线程系列(四)—ReentrantLock的使用详解编程语言
- MySQL与Java的强强联合:开启智能数据库时代(mysql和java)
- 技巧Linux环境下提高Java编译效率的技巧(linux下java编译)
- 自动提交MySQL事务中的Java自动提交实践(mysql事务java)
- 程序Linux命令调用Java程序实现交互(linux命令java)
- Linux调用Java实现编程快速开发(linux调用java)
- Java 调用 MySQL,编写数据库程序(java导入mysql)
- Java调用Redis实现高性能数据存储(java调用redis)
- 切换双系统:Linux与Windows的交互(linux和windows双系统)
- 如何在Windows下安装Linux系统(如何在windows下安装linux)
- 市场Oracle公司助力Java攻克市场(oracle公司java)