当前位置: 首页 > 编程笔记 >

Java编程使用Runtime和Process类运行外部程序的方法

司寇高峯
2023-03-14
本文向大家介绍Java编程使用Runtime和Process类运行外部程序的方法,包括了Java编程使用Runtime和Process类运行外部程序的方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了Java编程使用Runtime和Process类运行外部程序的方法。分享给大家供大家参考,具体如下:

使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序。

1. exec(String command)
2. exec(String command, String envp[], File dir)
3. exec(String cmd, String envp[])
4. exec(String cmdarray[])
5. exec(String cmdarray[], String envp[])
6. exec(String cmdarray[], String envp[], File dir)

一般的应用程序可以直接使用第一版本,当有环境变量传递的时候使用后面的版本。其中2和6版本可以传递一个目录,标识当前目录,因为有些程序是使用相对目录的,所以就要使用这个版本。

cmd.exe /c start <FileName>

使用DOS命令(比如dir)时也要使用到调用。如果想与调用的程序进行交互,那么就要使用该方法的返回对象Process了,通过Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能。

用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式:

Process process = Runtime.getRuntime().exec(".\\p.exe");
process.waitfor();

在上面的程序中,第一行的“.\\p.exe”是要执行的程序名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行

但在windows平台上,如果处理不当,有时并不能得到预期的结果。下面是笔者在实际编程中总结的几种需要注意的情况:

1、执行DOS的内部命令

如果要执行一条DOS内部命令,有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上,可写成exec("cmd.exe   /c dir"),在windows95/98下,可写成“command.exe /c dir”,其中参数“/c”表示命令执行后关闭DOS立即关闭窗口。另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec("my_dir.bat")。如果仅仅写成exec("dir"),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。

2、打开一个不可执行的文件

打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:

exec("start .\\a.doc");
exec("Files\\Microsoft Office\\office\\winword.exe .\\a.doc");

显然,前一种方法更为简捷方便。

3、执行一个有标准输出的DOS可执行程序

在Windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor()语句。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java中Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:

String s;
Process process = Runtime.getRuntime().exec("cmd /c dir \\windows");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream());
while((s=bufferedReader.readLine()) != null)
System.out.println(s);
process.waitfor();

更多关于java相关内容感兴趣的读者可查看本站专题:《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

 类似资料:
  • 我正在尝试从java执行应用程序。当我在集成了eclipse的tomcat上运行它时,它工作得很好。当我试图在集成了操作系统的tomcat服务器上通过将.war文件部署到webapps中来做同样的事情时,它不起作用。它也没有遇到任何错误。即使我检查了日志,也没有任何错误,只有常见的tomcat访问日志。是否有其他方法可以执行firefox、chrome、gedit等应用程序。 注意:等基本bash

  • 本文向大家介绍C#使用Process类调用外部exe程序,包括了C#使用Process类调用外部exe程序的使用技巧和注意事项,需要的朋友参考一下 在编写程序时经常会使用到调用可执行程序的情况,本文将简单介绍C#调用exe的方法。在C#中,通过Process类来进行进程操作。 Process类在System.Diagnostics包中。 示例一 通过上述代码可以调用记事本程序,注意如果不是调用系统

  • 本文向大家介绍C#使用Process类调用外部程序分解,包括了C#使用Process类调用外部程序分解的使用技巧和注意事项,需要的朋友参考一下 在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能。它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程。 一、启动进程实例 Process.Start 方法,启动(或重用)此 Process 组件的 Sta

  • 问题内容: 我正在编写一个Java应用程序,我需要在该应用程序的整个生命周期中在后台运行进程。 这是我所拥有的: 因此,基本上我每个都打印出来。 我不确定的事情是如何在应用程序中实现此代码,因为无论我将其放置在何处(使用Runnable),它都会阻止其他代码运行(如预期的那样)。 我用过Runnable,Thread,SwingUtilities,但没有任何效果… 任何帮助将不胜感激 :) 问题答

  • 问题内容: 我正在尝试从Java程序运行外部程序,但遇到了麻烦。基本上我想做的是这样的: 但是,我发现这是行不通的-Java清单需要使用带有输入和输出流以及其他我没有经验的东西。 我看了互联网上的许多示例(其中许多来自SO),并且似乎没有一种简单的标准方法来完成此操作,对于不完全了解正在发生的事情的人来说,可能非常令人沮丧。 我也很难在其他人的代码示例上构建自己的代码,因为通常看来,大多数其他人1

  • 我有一个使用apache的简单程序。poi外部库以操作excel文件。我在windows环境中使用了eclipse,现在我必须用terminal在linux上编译和运行我的程序。我搜索了如何包含我需要的那些罐子,但最终出现了以下错误: 错误:无法找到或加载主类xlsToCsv。 我遵循的步骤如下: javac-cp/jars/poi-3.13-20150929。罐子:/jars/poi-ooxml