Java调用windows程序

由于工作中要使用Java调用4U Wma Mp3 Converter命令行将vox格式转换成WMA格式,以方便在网页中试听,所以想到用java.lang.Runtime来处理这个问题。在使用过程中碰到了一些以前没有留意的问题,整理如下:

一 最简单的调用方式
String cmd="WMAMP3Converter.exe";
java.lang.Runtime.getRuntime().exec(cmd+" /""+filePath+"/" /wma");
总结:此方法,要求可执行文件在Tomcat的工作目录中。一般的,程序安装目录都在Tomcat目录之外,所以使用绝对路径来替代以上方案。

二 使用全路径调用可执行文件
String cmd="C://WMA//WMAMP3Converter.exe";
java.lang.Runtime.getRuntime().exec(cmd+" /""+filePath+"/" /wma");
总结:此调用方式执行没有问题,后来测试完成后部署到服务器上,发现问题又出来了,程序执行错误。分析原因,因为本地测试和服务器安装路径不同,服务器安装软件的目录为C:/Program Files/4U Computing/WMA MP3 Converter/,这里路径里有空格,造成空格处断开,所以命令行无法正确截取参数。

三 安全的全路径方式调用执行文件
String cmd="/"C://Program Files//4U Computing//WMA MP3 Converter//WMAMP3Converter.exe/"";
java.lang.Runtime.getRuntime().exec(cmd+" /""+filePath+"/" /wma");
总结:在cmd串中,把可执行文件的全路径用双引号包含,就可以解决路径、文件名中包含空格、全角字符等问题。

程序运行一段时间以后,发现有时候程序执行完后转换文件没有,程序没有错误,而且服务器上有很多进程没有结束。原来调用可执行文件失败了,但是程序不知道,以为成功了,然后继续去找转换后的文件来播放导致失败。分析原因,是因为上面的方式异步的,也就是说java提交运行文件的命令以后,立即转到播放模块。
解决办法就是让命令行同步方式执行,也就是主程序等待调用可执行文件结束以后再执行。(注:当然,播放之前检查文件是否存在也是可以的,这里是说明同步异步的问题。)

四 异步方式调用外部可执行文件
Process process=null;
String cmd="/"C://Program Files//4U Computing//WMA MP3 Converter//WMAMP3Converter.exe/"";
process = java.lang.Runtime.getRuntime().exec(cmd+" /""+filePath+"/" /wma");
process.waitFor();
总结:构造一个Process对象,将运行进程获取过来,控制这个进程等待调用结束再继续运行。OK。

五 顺便说一下,使用Process对象以后,可以用如下方法返回错误信息和输出信息,来进一步控制进程运行。
process.exitValue()
process.getErrorStream()
process.getInputStream()
process.getOutputStream()

时间: 2024-10-30 20:44:24

Java调用windows程序的相关文章

java调用windows自带的语音库

问题描述 java调用windows自带的语音库 我想做一个英语教学软件,其中用到tts,但是java如何才能用已经安装的语音库来进行发音(现在就是不清楚要调用那些dll,dll里面有哪些方法)? 解决方案 http://download.csdn.net/detail/qq781299372/3855882 解决方案二: tts运行库http://mydown.yesky.com/soft/255/255680_more.shtml xp以上,非精简的系统都是自带. 解决方案三: http:/

java调用matlab程序

在实际Java编程中,我们可能想要使用matlab编写一些复杂的数值计算算法,然后导入我们的java项目中调用.这首先需要我们matlab的jdk版本和java项目的jdk版本对应一致.想查看matlabjdk版本,可以在matlab命令行中输入version -java来查看,会看到类似下面的内容: Java 1.7.0_60-b19 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode .下面我们来看看mat

java 调用exe程序挂起

问题描述 java 调用exe程序挂起 最近在做一个java工具,java多线程执行bat文件, 每个bat文件又会调用两个exe文件( a.exe | b.exe ). 每一个线程单独执行一个bat文件.线程执行bat文件. 因为数据量很大,活执行很多次bat文件(几万次吧). 当执行到某一个bat的时候,调用的某一个exe好像会阻塞, 使全部的exe都挂起(进程存在,不占用cpu,好像死了一样). 如果结束java程序的话,挂起的exe会继续执行完. 在网上查了,说在调用完bat文件,等在执

Java调用Windows的DOS命令的方法_java

这是一个使用java代码调用dos命令的实例,在这里我就不多说,直接上代码,代码如下: 复制代码 代码如下: import java.io.*; /**  *  Java调用windows的DOS命令  *  实现调用Windows的ipconfig命令,然后将输出的信息通过IO流输出到控制台.  */ public class RunWindowsCommand{     public static void main(String[] args) {         InputStream

JAVA调用windows下dll文件程序代码

JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shared object]文件). JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程.JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中文件名是:libjnidispatch.so)可以自动实现Java与C

java 调用windows api 问题 求高手解答

问题描述 用java调用windowsapi能否体现调用接口过程,能否查看数据在内存中变换过程???求高手解答!!!!

java调用c程序通信示例代码_java

复制代码 代码如下: //===============Client Struct================#pragma pack(push,4) #define LOG_SEND 0#define MSG_SEND 1#define EXIT_SEND 2#define BUFFER_MAX_SIZE 512#define HEADER_LEN  sizeof(Header)typedef struct HeaderStruct{ int OP;//OP : 0--> Login  1

JAVA调用C++程序,C++执行完毕后报错。。错误信息看不懂。求救

问题描述 程序功能是实现简单的googlemapjsp前台显示上传图片,c程序将图片分割,之后网页在刷新.错误位置:c程序执行完毕时报错//...successImagedisconstrutor//c程序分割完毕##AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:##SIGSEGV(0xb)atpc=0x0017fea9,pid=4398,tid=2633743216##JREversion:6.0_20-b20#JavaVM:Ope

JAVA 调用WINDOWS API 管理进程 或者使用JAVA已有函数管理

问题描述 本人菜鸟还是在校生不熟悉WINDOWSAPI但是这几天要做的东西需要用到这方面的所以请大牛们来给小弟举个例子最好能够解释一下谢谢了需求如下:1创建一个进程并对其内存使用进行限制当进程使用内存超出限制时结束进程并返回提示2创建一个进程并对其运行时间进行限制当进程运行时间超出限制时结束进程并返回提示 解决方案 解决方案二:1,关于内存控制不会,用C应该会简单的多2,System.currentTimeMillis();可以获得系统当前时间,long型的,还有Date类,也可以来实现具体的L