java.lang.Runtime执行命令
1、使用说明
java.lang提供了一系列对 Java 编程至关重要的类。具体提供的类可看:https://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html
其中 Runtime 是 java.lang 中的一个类,主要是与操作系统交互执行操作命令。
而在java.lang.Runtime中我们主要关注exec()方法,使用该方法执行具体的命令,而执行exec()方法有以下六种重载形式,可以传入不同的数据类型的参数,如下图所示:
方法 | 英文释义 | 中文释义(非标准) |
---|---|---|
exec(String[] cmdarray) | Executes the specified command and arguments in a separate process. | 在单独的进程中执行指定的命令和参数。 |
exec(String command) | Executes the specified string command in a separate process. | 在单独的进程中执行指定的字符串命令。 |
exec(String command, String[] envp, File dir) | Executes the specified string command in a separate process with the specified environment and working directory. | 在具有指定环境和工作目录的单独进程中执行指定的字符串命令。 |
exec(String command, String[] envp) | Executes the specified string command in a separate process with the specified environment. | 在具有指定环境的单独进程中执行指定的字符串命令。 |
exec(String[] cmdarray, String[] envp) | Executes the specified command and arguments in a separate process with the specified environment. | 在具有指定环境的单独进程中执行指定的命令和参数。 |
exec(String[] cmdarray, String[] envp, File dir) | Executes the specified command and arguments in a separate process with the specified environment and working directory. | 在具有指定环境和工作目录的单独进程中执行指定的命令和参数。 |
java.lang.Runtime 的 API 文档https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html
目前我们只先关注exec(String command)和exec(String[] cmdarray)这两种执行方式。
下面通过示例代码来理解。
1.1、exec(String command)
在单独的进程中执行指定的字符串命令。
简单来说就是直接执行字符串命令。
♾️ java 代码://简易示例代码
String command = "whoami";
Runtime.getRuntime().exec(command)
1.2、exec(String[] cmdarray)
在单独的进程中执行指定的命令和参数。
简单来说就是以数组的形式接收多个字符串然后执行。
♾️ java 代码://简易示例代码
String[] command = { "cmd", "/c", "whoami" };
Runtime.getRuntime().exec(command)
三、java.lang.ProcessBuilder执行命令
1、使用说明
在上面介绍了java.lang。java.lang.Runtime是其中的一个API。而java.lang.ProcessBuilder也是java.lang中的一个API。该类主要用于创建操作系统进程。具体介绍可查看:https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html。
在java.lang.ProcessBuilder中我们要关注command()方法,可通过该方法设置要执行的命令参数。以及start()方法,简单来说使用该方法可以执行命令。以及
1.1、command()方法
官方原文介绍:https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#command()
command()方法主要用于设置要执行的命令。
command()方法传参有两种方式,一种是可变的字符串(简单说就是可以传入普通字符串,或者字符串数组),另一种是字符串列表,
♾️ java 代码://简易示例代码
ProcessBuilder p = new ProcessBuilder();
p.command("calc");
1.2、start()方法
官方原文介绍:https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#start()
使用start()方法可以创建一个新的具有命令,或环境,或工作目录,或输入来源,或标准输出和标准错误输出的目标,或redirectErrorStream属性的进程。
新进程中调用的命令和参数有command()方法设置,工作目录将由directory()方法设置,进程环境将由environment()设置。
在使用command()方法设置执行命令参数后,然后由start()方法创建一个新的进程进而在系统中执行了我们设置的命令。
这么看来java.lang.ProcessBuilder#start()和Runtime.exec(String[] cmdarray, String[] envp, File dir)有些相似。
♾️ java 代码://简易示例代码
Process cmd = new ProcessBuilder(command).start();
四、java.lang.UNIXProcess/ProcessImpl执行命令
1、使用说明
首先对于UNIXProcess和ProcessImpl可以理解本就是一个东西,因为在 JDK9 的时候把UNIXProcess合并到了ProcessImpl当中了。具体可查看:https://hg.openjdk.java.net/jdk-updates/jdk9u/jdk/rev/98eb910c9a97
。
UNIXProcess和ProcessImpl最终都是调用native执行系统命令的类,这个类提供了一个叫forkAndExec的native方法,如方法名所述主要是通过fork&exec来执行本地系统命令。
UNIXProcess类是*nix系统在 java 程序中的体现,可以使用该类创建新进程,实现与”fork”类似的功能(对于Windows系统,使用的是java.lang.ProcessImpl类)
ProcessImpl 是更为底层的实现,Runtime和ProcessBuilder执行命令实际上也是调用了ProcessImpl这个类。
对于 ProcessImpl 类,我们不能直接调用需要配合使用反射。因为 java.lang.ProcessImpl 代码都被 private 封装起来了。并没有设置公共的 API 接口。