一、概述
ProcessBuilder类是J2SE
1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE
1.5之前,都是由Process类处来实现进程的控制管理。
每个 ProcessBuilder 实例管理一个进程属性集。它的start()
方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。
(我在《深入研究java.lang.Runtime类》中讲过,进程也可以由Runtime.exec()启动。)
每个进程生成器(即ProcessBuilder对象)管理这些进程属性:
命令
是一个字符串列表,它表示要调用的外部程序文件及其参数(如果有)。在此,表示有效的操作系统命令的字符串列表是依赖于系统的。例如,每一个总体变量,通常都要成为此列表中的元素,但有一些操作系统,希望程序能自己标记命令行字符串——在这种系统中,Java
实现可能需要命令确切地包含这两个元素。
环境
是从变量 到值
的依赖于系统的映射。初始值是当前进程环境的一个副本(请参阅 System.getenv())。
工作目录
。默认值是当前进程的当前工作目录,通常根据系统属性 user.dir 来命名。
redirectErrorStream 属性
。最初,此属性为
false,意思是子进程的标准输出和错误输出被发送给两个独立的流,这些流可以通过 Process.getInputStream() 和
Process.getErrorStream() 方法来访问。如果将值设置为
true,标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。在此情况下,合并的数据可从 Process.getInputStream()
返回的流读取,而从 Process.getErrorStream() 返回的流读取将直接到达文件尾。
既然有Process类,那为什么还要发明个ProcessBuilder类呢?ProcessBuilder和Process两个类有什么区别呢?
原来,ProcessBuilder为进程提供了更多的控制,例如,可以设置当前工作目录,还可以改变环境参数。而Process的功能相对来说简单的多。
ProcessBuilder是一个final类,有两个带参数的构造方法,你可以通过构造方法来直接创建ProcessBuilder的对象。而Process是一个抽象类,一般都通过Runtime.exec()和ProcessBuilder.start()来间接创建其实例。
注意:
修改进程构建器的属性将影响后续由该对象的 start()
方法启动的进程,但从不会影响以前启动的进程或 Java 自身的进程。
ProcessBuilder类不是同步的。如果多个线程同时访问一个
ProcessBuilder,而其中至少一个线程从结构上修改了其中一个属性,它必须 保持外部同步。
很容易启动一个使用默认工作目录和环境的新进程:
Process p = new ProcessBuilder("myCommand", "myArg").start();
下面是一个利用修改过的工作目录和环境启动进程的例子:
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1",
"myArg2");
Map<String, String> env =
pb.environment();
env.put("VAR1",
"myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") +
"suffix");
pb.directory("myDir");
Process p =
pb.start();
要利用一组明确的环境变量启动进程,在添加环境变量之前,首先调用 Map.clear()。
二、API预览
构造方法摘要
ProcessBuilder(List<String> command)
利用指定的操作系统程序和参数构造一个进程生成器。
ProcessBuilder(String... command)
利用指定的操作系统程序和参数构造一个进程生成器。
方法摘要
command()
返回此进程生成器的操作系统程序和参数。
command(List<String> command)
设置此进程生成器的操作系统程序和参数。
command(String... command)
设置此进程生成器的操作系统程序和参数。
directory()
返回此进程生成器的工作目录。
directory(File directory)
设置此进程生成器的工作目录。
environment()
返回此进程生成器环境的字符串映射视图。
redirectErrorStream()
通知进程生成器是否合并标准错误和标准输出。
redirectErrorStream(boolean redirectErrorStream)
设置此进程生成器的
redirectErrorStream 属性。
start()
使用此进程生成器的属性启动一个新进程。
三、常见应用
若要使用ProcessBuilder创建一个进程,只需要创建ProcessBuilder的一个实例,指定该进程的名称和所需参数。要执行此程序,调用该实例上的start()即可。下面上一个执行Windows记事本的例子。注意它将要编辑的文件名指定为一个参数。
class
PBDemo {
public
static
void
main(String args[]) {
try
{
ProcessBuilder proc =
new
ProcessBuilder("notepad.exe"
, "testfile"
);
proc.start();
} catch
(Exception e) {
System.out.println("Error
executing notepad."
);
}
}
}
分享到:
相关推荐
在Java编程环境中,调用Windows操作系统来实现文本转语音(Text-to-Speech, TTS)并生成播放文件是一项常见的需求。这项技术可以帮助开发者为应用程序添加语音合成功能,尤其适用于无障碍应用、语音助手或者多媒体...
标题 "exchange/powershell,Java调用powershell开通邮箱" 暗示了这是一个关于使用Java编程语言调用PowerShell脚本在Exchange服务器上创建邮箱的教程或项目。Exchange是微软提供的一款企业级电子邮件服务器软件,而...
Java如何基于ProcessBuilder类调用外部程序 Java中的ProcessBuilder类提供了一种方便的方式来调用外部程序。通过ProcessBuilder类,可以轻松地执行外部命令,并获取其输出结果。在本文中,我们将详细介绍如何使用...
在Java中调用FFmpeg,通常有两种方式:直接执行系统命令和使用Java库。直接执行命令是通过Runtime.exec()方法或ProcessBuilder类来调用FFmpeg的命令行工具,例如: ```java String command = "ffmpeg -i input.mp4 ...
在 Java 中,使用 ProcessBuilder 类可以执行外部命令或程序,例如执行系统命令、运行可执行文件等。但是,默认情况下,ProcessBuilder 类的调用是阻塞的,即调用线程会等待外部命令或程序的执行完成后才继续执行。...
这通常涉及构建命令行参数,然后使用Java的Runtime或ProcessBuilder API来执行外部进程。转换完成后,返回新生成的AVI文件路径供`processFLV()`使用。 `processFLV()`方法则负责调用FFmpeg将文件转换为FLV。同样,...
总的来说,Java通过`Runtime`和`ProcessBuilder`提供了一种强大的方式来调用系统命令和执行外部程序。然而,必须谨慎处理这些调用,以防止潜在的安全问题,并确保正确处理命令的输入、输出和错误流。在实际开发中,...
解决这些问题通常需要结合日志分析,调试代码,以及对Linux和Java系统调用的深入理解。在实际应用中,为了提高稳定性和健壮性,可以考虑使用第三方库,如Apache POI或JODConverter,它们提供了更高级别的抽象,能更...
本文将深入探讨如何通过Java来调用VB编写的Surfer二次开发程序,实现等值线的生成。 首先,`surfer.dll`是一个动态链接库文件,它是Surfer软件的核心组件,包含了Surfer的各种功能接口。在VB(Visual Basic)中,...
在Java中调用SQL*Plus,通常有两种方式:一种是通过操作系统命令行(ProcessBuilder或Runtime类),另一种是使用第三方库如JDBC-ODBC桥接或者OCI驱动。 1. **使用操作系统命令行**: - 首先,确保你的系统环境变量...
在Java中调用OpenSSL,我们需要了解如何在Java程序中执行系统命令,这通常通过`Runtime.getRuntime().exec()`或`ProcessBuilder`类来实现。 以下是生成证书的基本步骤: 1. **生成私钥**:使用`openssl genpkey`...
本示例探讨了如何在Java工程中实现调用系统命令“ping”来达到这个目的。首先,我们需要理解“ping”命令的基本原理:它通过发送ICMP(Internet Control Message Protocol)回显请求数据包到目标主机,然后接收相应...
总的来说,"java 调用 ffmpeg 进行视频转换以及截图"的实践涉及了Java进程控制、系统命令调用、多媒体处理等多方面知识。通过合理运用这些技术,开发者可以在Java应用程序中实现丰富的视频处理功能,满足各种多媒体...
首先,Java通过`Runtime`类和`ProcessBuilder`类提供了调用操作系统命令的能力。`Runtime.getRuntime().exec()`方法是最常用的方式,它允许我们执行一个外部命令。例如,要执行简单的`ls`命令(在Unix/Linux系统中列...
Java调用DOS命令是指在Java程序中执行操作系统级别的命令,比如Windows下的CMD命令或Linux下的Shell命令。这种功能在很多场景下都很有用,比如自动化脚本、文件操作、系统管理等。Java提供了Runtime类和...
在Java中,我们可以使用Runtime类或ProcessBuilder类来执行系统命令。例如,我们可以创建一个方法,将FFmpeg的命令字符串化,然后通过这些类执行: ```java public void executeFFmpegCommand(String command) { ...
4. **使用进程通信**: 另一种方法是通过启动Python脚本作为独立的进程,然后使用Java的`ProcessBuilder`或`Runtime.exec()`来执行Python命令。这种方法较为通用,但需要处理进程间通信(如标准输入/输出流)。 5. *...
Java调用本地浏览器的示例,通常涉及到Java与操作系统交互的能力,这主要通过Java的`Runtime`类或者`ProcessBuilder`类实现。这两个类允许Java程序执行系统命令,例如打开一个本地已安装的浏览器来加载特定的URL。...
在Java编程语言中,有时我们需要实现与操作系统交互的功能,例如执行一些特定的本地应用程序或脚本等。本文将详细介绍如何在Java中调用本地exe文件,并解析提供的代码示例。 ### 一、Java中调用本地exe文件的基本...
总结来说,"使用Java调用Windows WIN脚本"涉及到Java与操作系统交互的关键技术,包括`Runtime`和`ProcessBuilder`的使用、理解批处理和VBS脚本的工作原理,以及通过第三方库如j-Interop来实现更复杂的操作,如调用...