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("<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();
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Windows中使用Java生成Excel文件并插入图片的方法

    生成简单的Excel文件  在现实的办公中,我们常常会有这样一个要求:要求把报表直接用excel打开.在实习中有这样一个需求.根据所选择的资源查询用户所提供附件的全部信息并生成excel供下载.但是在查询的时候我们需要来检测用户所提供的附件里面的信息是否有错误(身份证).有错误的生成错误信息excel.      Apache的POI项目,是目前比较成熟的HSSF接口,用来处理Excel对象.其实POI不仅仅只能处理excel,它还可以处理word.PowerPoint.Visio.甚至Outl

  • java执行windows下cmd命令的方法

    本文实例讲述了java执行windows下cmd命令的方法.分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: //获取运行时 Runtime rt = Runtime.getRuntime(); //获取进程 Process p = rt.exec(String[] cmdarray);//或者 Process p = rt.exec(String cmd); //如果p不为空,那么要清空 if(null!=p){destory p.destory(); p=null; } 例如

  • windows下zookeeper配置java环境变量的方法

    先找到文件 zookeeper的bin目录下编辑zkEnv.cmd 修改如下图 如果你的系统有多个JAVA_HOME类型的系统变量  则需要在该文件中指定用哪一个,并且还要修改windows的jdk环境变量 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想了解更多相关内容请查看下面相关链接

  • Windows系统中Java调用cmd命令及执行exe程序的方法

    Java调用cmd命令,并输出显示信息: package com.anxin.cmd.test; import java.io.BufferedReader; import java.io.InputStreamReader; public class Command { public static void main(String[] args) { try { Runtime rt = Runtime.getRuntime(); Process pr = rt.exec("cmd /c di

  • java仿windows记事本功能完整版

    最近学了Java编程,就编了仿windows系统下的记事本练练手,这个记事本实现了windows系统下的大部分功能,只有很少的部分没有实现,比如撤销命令的不完美,这是本人的能力有限,还有那些JMenuItem的是否可用问题,这只是本人比较偷懒,无心再去实现,希望能够与广大的Java爱好者分享我的代码,共同学习进步,我肯定有不足之处,比如有些代码的重复,代码的布置,以及变量的取名问题,希望广大的Java大牛多提宝贵意见,话不多少,直接上代码! package org.mfy.notepad; im

  • Java开发环境jdk 1.8安装配置方法(Win7 64位系统/windows server 2008)

    什么是jdk jdk是什么呢?jdk的是java development kit的缩写,意思是java程序开发的工具包.也可以说jdk是java的sdk. 目前的JDK大致分三个大版本: Java SE:Java Platform, Standard Edition,Java平台标准版,主要用来开发桌面程序 Java EE:Java Platform, Enterprise Edition,Java平台企业版,主要用来开发WEB程序 Java ME:Java Platform, Micro Ed

  • Java读写Windows共享文件夹的方法实例

    项目常常需要有访问共享文件夹的需求,例如共享文件夹存储照片.文件等.那么如何使用Java读写Windows共享文件夹呢? Java可以使用JCIFS框架对Windows共享文件夹进行读写,就这个框架可以让我们像访问本地文件夹一下访问远程文件夹. JCIFS的网址: http://jcifs.samba.org/ JCIFS是使用纯Java开发的一个开源框架,通过smb协议访问远程文件夹.该框架同时支持Windows共享文件夹和Linux共享文件夹,不过,Linux共享文件夹需要安装Samba服务

  • 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:/c

  • Windows下Java调用OCR进行图片识别

    使用Java语言,通过Tesseract-OCR对图片进行识别. 1.Tesseract-OCR 下载windows版本并安装. 2.程序如下: a.ImageIOHelper类 package OCR; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Locale; import ja

  • Ruby连接使用windows下sql server数据库代码实例

    require 'win32ole' class SqlServer # This class manages database connection and queries attr_accessor :connection, :data, :fields def initialize @connection = nil @data = nil end def open # Open ADO connection to the SQL Server database connection_st

  • Java调用R语言实例讲解

    R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R. Rserve作为一个package发布在CRAN上,可以直接使用install.packages("Rserve")进行安装.需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供

  • Java加密算法RSA代码实例

    这篇文章主要介绍了Java加密算法RSA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java

  • windows下java -jar 后台运行以及杀死后台进程的操作

    在你的jar文件当前目录中建立一个bat文件: 内容是:注意文件名要对应 @echo off START "commandServer" javaw -jar command-0.0.1-SNAPSHOT.jar 之后双击bat文件就能后台启动jar包啦 杀死后台进程 首先执行命令 (你要知道你运行的jar文件的端口号) netstat -aon | findstr "9998" 可以看到PID为6452 然后在执行: tasklist|findstr "

  • Windows下Java环境变量配置详解

    前言 在Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH,下面来详细的介绍. JAVA_HOME 指向的是JDK的安装路径,如C:\jdk1.5.0_06,在这路径下你应该能够找到bin.lib等目录. ( 今晚使用新系统配置,不知道怎么的需要加bin才可以在CMD运行,JAVA_HOME=C:\jdk1.5.0_06\bin; 下面是网上整理实践可使用贴上的,注意JDK和Eclipse必须同位数Bit才可以使用,不能是不同位数的程序,已实践,不

  • 通过Java压缩JavaScript代码实例分享

    通过移除空行和注释来压缩 JavaScript 代码 /** * This file is part of the Echo Web Application Framework (hereinafter \"Echo\"). * Copyright (C) 2002-2009 NextApp, Inc. * * Compresses a String containing JavaScript by removing comments and whitespace. */ public

  • laravel下trait的使用代码实例详解

    前言 今天在整理laravel的练习项目时,发现自己的代码结构中有很多重复的代码.于是搜索了一下laravel框架的代码复用机制.知道了Trait的存在,于是学习使用了一下. 关于Trait的理解 Trait是PHP5.4引入的新概念,定义方式和class的定义方式类似.但是并不具备class的完整性.Trait看上去更像是一个class的一部分.它使不相关的两个class能够具有类似的行为. Trait的简单使用 新建一个Trait 本人由于数据库操作上使用了eloquent模型,在多表查询时

  • java调用mysql存储过程实例分析

    本文实例讲述了java调用mysql存储过程的方法.分享给大家供大家参考.具体如下: 数据库的测试代码如下 : 1.新建表test create table test( field1 int not null ) TYPE=MyISAM ; insert into test(field1) values(1); 2.删除已存在的存储过程: -- 删除储存过程 delimiter // -- 定义结束符号 drop procedure p_test; 3.mysql存储过程定义: create p

随机推荐