转自:http://blog.csdn.net/54powerman/archive/2006/04/03/649086.aspx
由于工作中要使用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()
分享到:
相关推荐
是java程序调用windows中的应该程序的例子, 大家可以可以参考一下.
JAVA如何调用WINDOWS命令行 用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令
进程可根据该pid调用exec自杀 注意事项:不能改变PidTool.java所在的包,否则需要重行生成dll。 编译命令中 "-PidTool.dll" 改为 "-FePidTool.dll",我整漏了! 使用方法: 1.javac PidTool.java 2.javah -jni ...
使用java实现windows弹窗
使用JavaService把Java程序转换成windows服务
有时候,JAVA程序需调用本地的批处理进行一些处理,下面的代码就演示了如何在JAVA中调用本地的批处理文件
使用JavaService将java程序安装位windows服务
利用JAVA来访问注册表,希望对大家有帮助
1、Labview生成Dll文件 2、Java通过Jnative第三方Jar包调用Labview生成的DLL文件 3、Java在Windows系统调用Labview生成的Dll的说明 有JNative的使用说明 直接下载,根据使用说明可以直接使用。
数据存储:Windows记账程序需要能够保存用户的财务信息。本程序使用MySQL,sql代码已包含在内,按照指示配置即可。 数据模型和逻辑:设计数据模型和实现相关的业务逻辑。考虑使用面向对象的设计模式,将数据、界面...
使用Eclipse创建和运行Java程序 使用Eclipse开发Java程序 ...在Windows下使用Eclipse,除了需要Eclipse软件包之外,还需要Java的JDK来支持Eclipse的运行。 Eclipse开发环境 创建工作空间workspace 创建工程proj
一起来画画是一款用Java语言编写的模拟 Windows系统自带画图工具的程序。此画图程序集合了设置画笔粗细、选择背景颜色、选择画笔颜色、绘制图形、清除图像、使用橡皮和展开简笔画参考示例等功能。
java 程序使用redis + windows服务端 1.点击 /redis服务端/hcredis.bat 启动服务端 2.把jar导入到项目里面 3.把配置文件 redis.properties 导入 src下 4.JedisUtil.java 里面提供了缓存的添加 删除
java调用本地dll的几种方法性能对比测试。 JNA消耗的总时间(ms):5406 bridj消耗的总时间(ms):984 JNI消耗的总时间(ms):47 包含c++源码和java源码,部署和使用方法。在win7和winxp下测试用过。 部分源码是...
Java调用windows字体美化窗口,显示多种字体,用JLabel实现,可以很方便 的调用宋体、黑体、Sanf等多种系统字体,轻松改变窗口界面中的字体风格,从而起到美化窗口界面的作用。代码是这样的: //字体数组: ...
Java通过JNA调用系统API示例,调用 Kernel32.dll文件中的GetLocalTime(),GetSystemTime(),SetLocalTime()方法。
1、实现友好的Windows画板界面,包括Windows基本菜单、画图功能菜单和常用菜单的工具栏。 2、实现画不同颜色,不同宽度,不同...9、将开发好的应用程序及其所需的DLL文件通过打包软件,制作成安装程序,以供他人使用。
JAVA写的画图程序,附件为Eclipse工程文件夹,实现Windows自带画图的自定义缩放画布、直线、圆、矩形、线宽/颜色定义等基本功能。
Java读取Windows字体并演示字体样式效果,程序读取Windows系统所安装的字体,然后允许用户对字体样式进行自定义,最后使用Graphics2D 类中的drawString()绘制输出字体效果,如演示截图所示的运行结果。