Java调用windows程序

简介: 由于工作中要使用Java调用4U Wma Mp3 Converter命令行将vox格式转换成WMA格式,以方便在网页中试听,所以想到用java.lang.Runtime来处理这个问题。

由于工作中要使用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()

目录
相关文章
|
3月前
|
Java 流计算
利用java8 的 CompletableFuture 优化 Flink 程序
本文探讨了Flink使用avatorscript脚本语言时遇到的性能瓶颈,并通过CompletableFuture优化代码,显著提升了Flink的QPS。文中详细介绍了avatorscript的使用方法,包括自定义函数、从Map中取值、使用Java工具类及AviatorScript函数等,帮助读者更好地理解和应用avatorscript。
利用java8 的 CompletableFuture 优化 Flink 程序
|
4月前
|
XML 存储 JSON
Java程序部署
Java程序部署
|
2月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
53 1
|
2月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
94 1
|
3月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
496 2
|
3月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
182 1
|
3月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
97 1
|
3月前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
55 1
|
3月前
|
Java Linux Windows
windows版java版本管理器
本文介绍了如何在Windows上使用JDK版本管理器jvms来管理多个Java版本,包括下载、初始化、列出本地安装的JDK版本、在线查看可用版本、切换和安装特定版本的Java。
166 0
windows版java版本管理器
|
4月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
56 5