`
daoshud1
  • 浏览: 556709 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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");
int i=process.waitFor();
//返回0代表正常安装完成
//返回1 255 代表未安装完成

总结:构造一个Process对象,将运行进程获取过来,控制这个进程等待调用结束再继续运行。OK。

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

相关推荐

    java调用Windows应用程序

    ### Java调用Windows应用程序知识点详解 #### 一、概述 在Java编程中,有时我们需要让Java程序去调用操作系统中的其他应用程序,例如打开记事本(Notepad)、启动计算器(Calculator)等。这种方式不仅可以增强...

    java调用windows命令

    以下是如何使用Java调用Windows命令行的详细步骤和注意事项: 1. **调用外部程序** - 使用`Runtime.getRuntime().exec()`方法创建一个子进程来执行指定的可执行程序。例如: ```java Process process = Runtime....

    java 调用windows API

    Java调用Windows API是将Java程序与Windows操作系统底层功能相结合的一种技术。这使得Java开发者能够利用Java的跨平台优势,同时访问到特定于Windows系统的功能。以下是对这一主题的详细阐述: 1. **jinvoke.jar**...

    使用java调用windows WIN脚本

    这篇博客文章"使用Java调用Windows WIN脚本"探讨了如何利用Java的接口来与Windows环境进行交互,实现这种跨平台语言与操作系统功能的融合。 首先,Java中可以通过`Runtime`或`ProcessBuilder`类来执行外部命令,...

    Linux环境下实现Java调用Windows环境下的Matlab函数

    ### Linux环境下实现Java调用Windows环境下的Matlab函数 #### 一、所需条件及说明 为了实现在Linux环境中通过Java程序来调用Windows系统下的Matlab函数,首先需要确保满足以下条件: 1. **Windows环境下**: - ...

    java程序做成Windows服务运行

    Java程序在Windows操作系统上作为服务运行,是一种常见的部署方式,特别是在需要后台持续运行且与系统启动同步的应用场景中。要实现这一目标,我们可以利用开源工具Winsw,它是一个小型的Windows服务封装器,允许...

    java 调用windows的一些可执行文件

    这可能涉及使用Windows上的某个音频转换工具,如ffmpeg,通过Java调用来实现。具体的实现细节取决于代码内容,但基本思路是构建正确的命令行指令,并使用Runtime或ProcessBuilder来执行。 6. **安全注意事项**:...

    java中两种方式调用其他.exe可执行程序

    使用 Java 调用其他.exe 可执行程序时,需要注意以下几点: * 需要确保调用其他.exe 可执行程序的权限,避免出现权限不足的错误。 * 需要确保调用其他.exe 可执行程序的路径正确,避免出现文件不存在的错误。 * ...

    java调用windows api

    Java调用Windows API是将Java程序与Windows操作系统底层功能相结合的一种技术。这允许Java开发者利用Java的跨平台特性,同时可以访问到特定于Windows系统的功能,例如注册表操作、文件系统监控、用户权限管理等。要...

    java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码

    在Java中,我们可以使用Java Native Interface(JNI)来调用Windows API,获得系统的内存信息和CPU使用率。我们可以使用GetSystemInfo函数来获得系统的内存信息,包括物理内存的大小、可用内存的大小和页面文件的...

    java调用windows串口

    Java调用Windows串口是Java开发中的一种常见需求,特别是在嵌入式系统、物联网设备或者与硬件交互的应用中。在Java中,虽然标准库没有直接提供串口通信的支持,但可以通过JNI(Java Native Interface)或者第三方库来...

    java程序注册windows 服务

    Java Service Wrapper(JSW)是一个广泛使用的开源工具,用于将Java应用程序包装成Windows服务。它支持32位和64位系统,并提供了配置文件,使得开发者可以轻松地控制服务的行为。 3. **配置文件**: 在JSW中,...

    Java调用应用程序和Dos中的命令

    ### Java调用应用程序和Dos中的命令 在Java编程中,有时候我们需要执行一些操作系统级别的任务,例如启动一个外部程序、执行一些系统命令等。这通常可以通过Java的`Runtime`类实现,尤其是通过`Runtime.exec()`方法...

    windows 下java调用winrar压缩文件为rar 格式

    在Windows环境下,使用Java进行程序开发时,有时我们需要对文件进行压缩操作,比如将文件压缩成RAR格式。这个过程涉及到Java的本地方法调用、文件I/O操作以及第三方库的集成。下面我们将详细探讨如何在Java中实现这...

    Java调用Win32获取窗口句柄JNative-1.3.2

    总结来说,Java调用Win32获取窗口句柄JNative-1.3.2是一种使用JNI技术来实现Java与Win32 API交互的方法。通过JNative库,开发者可以轻松地在Java应用程序中查找并操作特定的Windows窗口,增强了Java应用程序的功能和...

    如何在JAVA中调用windows_API.doc

    在Java中调用Windows API是通过Java本地接口(JNI,Java Native Interface)来实现的,这允许Java代码直接与操作系统...在必要时,应优先考虑使用纯Java解决方案,或者寻找已有的Java库来替代对Windows API的直接调用。

    java获取当前windows进程pid

    进程可根据该pid调用exec自杀 注意事项:不能改变PidTool.java所在的包,否则需要重行生成dll。 编译命令中 "-PidTool.dll" 改为 "-FePidTool.dll",我整漏了! 使用方法: 1.javac PidTool.java 2.javah -jni ...

    JAVA访问WINDOWS注册表

    在编程领域,有时我们需要在Java程序中访问操作系统的特定功能,比如Windows的注册表。注册表是Windows系统中存储配置信息的重要数据库,包含了系统设置、应用程序数据和用户配置等信息。本文将详细介绍如何使用Java...

Global site tag (gtag.js) - Google Analytics