添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
活泼的柚子  ·  Type.GetProperties 方法 ...·  3 周前    · 
曾经爱过的刺猬  ·  Windows-Terminal ...·  2 月前    · 
失恋的杯子  ·  mongodb 根据主键id ...·  10 月前    · 
眉毛粗的草稿纸  ·  Enable the Lock Pages ...·  1 年前    · 

ProcessBuilder 概述

1、public final class java.lang.ProcessBuilder extends Object :此类 用于创建操作系统进程

2、每个 ProcessBuilder 实例管理一个进程属性集,start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。

3、此类不是同步的,如果多个线程同时访问一个 ProcessBuilder,而其中至少一个线程从结构上修改了其中一个属性,它必须保持外部同步。

4、此类从 JDK 5 开始推出,用于替代之前的 Runtime 类,可以参考 《Process 详解 1》 《Runtime 详解四》

5、注意事项: 使用 Runtime 时,只要程序和参数的路径中没有空格是可以写到一个参数中的,默认按空格分隔;但是 ProcessBuilder 设置程序和参数必须分开写,否则报错:“系统找不到指定的文件”。

启动使用默认工作目录和环境的新进程很容易:

Process p = new ProcessBuilder("myCommand", "myArg").start();

一共重载了两个构造函数,一个参数是 list,一个是 array。

public ProcessBuilder (List<String> command)

1)利用指定的操作系统程序和参数构造一个进程生成器
2)此构造方法不会 制作一份 command 列表的副本
3)不会检查 command 是否为一个有效的操作系统命令。
4、参数:command - 包含程序及其参数的列表 , 程序和参数必须分开写
5、抛出: NullPointerException - 如果参数为 null

public ProcessBuilder (String... command)

1、利用指定的操作系统程序和参数构造一个进程生成器。
2、一个有用的构造方法,它将进程生成器的命令设置为与 command 数组包含相同字符串的字符串列表,且顺序相同。
3、不会检查 command 是否为一个有效的操作系统命令。
4、参数:command - 包含程序及其参数的字符串数组, 程序和参数必须分开写

Modifier and Type Method and Description
List < String > command () 返回此流程构建器的操作系统程序和参数。
ProcessBuilder command ( List < String > command) 设置此流程构建器的操作系统程序和参数。
ProcessBuilder command ( String ... command) 设置此流程构建器的操作系统程序和参数。
File directory () 返回此进程构建器的工作目录。
ProcessBuilder directory ( File directory) 设置此进程构建器的工作目录。
Map < String , String > environment () 返回此流程构建器环境的字符串映射视图。
ProcessBuilder inheritIO () 将子进程标准I / O的源和目标设置为与当前Java进程相同。
ProcessBuilder.Redirect redirectError () 返回此流程构建器的标准错误目标。
ProcessBuilder redirectError ( File file) 将此流程构建器的标准错误目标设置为文件。
ProcessBuilder redirectError ( ProcessBuilder.Redirect destination) 设置此流程构建器的标准错误目标。
boolean redirectErrorStream () 告诉这个进程构建器是否合并标准错误和标准输出。
ProcessBuilder redirectErrorStream (boolean redirectErrorStream) 设置此过程构建器的 redirectErrorStream 属性。
ProcessBuilder.Redirect redirectInput () 返回此流程构建器的标准输入源。
ProcessBuilder redirectInput ( File file) 将此流程构建器的标准输入源设置为文件。
ProcessBuilder redirectInput ( ProcessBuilder.Redirect source) 设置此流程构建器的标准输入源。
ProcessBuilder.Redirect redirectOutput () 返回此流程构建器的标准输出目标。
ProcessBuilder redirectOutput ( File file) 将此流程构建器的标准输出目标设置为文件。
ProcessBuilder redirectOutput ( ProcessBuilder.Redirect destination) 设置此流程构建器的标准输出目标。
Process start () 使用此流程构建器的属性启动新进程。

更多 API 可以参考官方文档: http://www.matools.com/api/java8

public Process start() throws IOException

1)使用此进程生成器的属性启动一个新进程

2) 此方法检查命令是否为一条有效的操作系统命令 ,哪条命令是有效的呢?这取决于系统,但至少命令必须是非空字符串的非空列表。

3)返回:一个新的 Process 对象,用于管理子进程

API 测试

启动 windows 自带的计算器

1、在 C:/windows/System32 目录下面,windows 系统自带了很多应用程序,如记事本、计算器、画图、shutdown 等等。

2、下面演示调用系统程序,不加参数,新开的程序就相当于一个子进程。

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
 * Created by Administrator on 2019/2/26 0026.
public class APITest {
    private static final Logger logger = Logger.getGlobal();//日志记录器
    public static void main(String[] args) {
        try {
            List<String> paramList = new ArrayList<>();
            //启动 windows 的计算器程序,第一个参数必须是可执行程序
            paramList.add("C:\\Windows\\System32\\calc.exe");
            /** 创建ProcessBuilder对象,设置指令列表*/
            ProcessBuilder processBuilder = new ProcessBuilder(paramList);
            logger.info("启动子进程...");
            Process process = processBuilder.start();
            logger.info("子进程启动完成...");
        } catch (IOException e) {
            e.printStackTrace();

启动 Potplayer 播放一个指定的视频文件

1、各种安装的软件都可以进行打开,这里比如安装好的视频播放器,我这里安装的是 PotPlayer 播放器,路径为:D:\PotPlayer\PotPlayerMini.exe

2、很多程序是支持在 cmd 调用时传递参数的,如 chrome.exe 浏览器等等,potPlayer 也可以在调用时指定参数。

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
 * Created by Administrator on 2019/2/26 0026.
public class APITest {
    private static final Logger logger = Logger.getGlobal();//日志记录器
    public static void main(String[] args) {
        try {
            List<String> paramList = new ArrayList<>();
            //启动 windows 上安装好的 potplayer 播放器,设置 exe 路径,路径必须存在
            //第一个参数必须是可执行程序
            paramList.add("D:\\PotPlayer\\PotPlayerMini.exe");
            //设置 potplayer 将要播放的文件,也就是给 potplayer 传递的参数,文件必须存在
            paramList.add("E:\\Study_Note\\Spring Cloud\\视频\\第1天\\4 服务提供者与服务消费者.avi");
            /** 创建ProcessBuilder对象,设置指令列表*/
            ProcessBuilder processBuilder = new ProcessBuilder(paramList);
            logger.info("启动子进程...");
            Process process = processBuilder.start();
            logger.info("子进程启动完成...");
            for (int i = 5; i > 0; i--) {
                logger.info((i) + " 秒后结束子进程...");
                Thread.sleep(1000);
            process.destroyForcibly();//强行终结开启的子进程
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();

然而并不是,所有的子进程,都能这么轻易杀死,对于需要在某些特定时刻杀死子进程的,可以参考:https://blog.csdn.net/wangmx1993328/article/details/80832181#t7 中的“杀死子进程 -> 解决方式 2” 部分。

使用 cmd 命令 ping 目标主机,然后将结果信息存放在指定文件中

ping 目标主机:属于 windows 指令,如果自己的电脑和目标主机之间网络通畅,则会返回成功信息,否则返回失败信息。

import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
 * Created by Administrator on 2019/2/26 0026.
public class APITest {
    private static final Logger logger = Logger.getGlobal();//日志记录器
    public static void main(String[] args) throws IOException {
        List<String> paramList = new ArrayList<>();
        //使用 cmd 命令 ping 远程主机
        //第一个参数必须是可执行程序,cmd也是一个可执行程序,位于 C:/Windows/System32目录下
        paramList.add("cmd");
        paramList.add("/c");
        paramList.add("ping www.taobao.com");//也可以是ip,如 paramList.add("ping 114.114.114.114");
        /** 创建ProcessBuilder对象,设置指令列表*/
        ProcessBuilder processBuilder = new ProcessBuilder(paramList);
        //获取桌面路径,如:C:\Users\Administrator.SC-201707281232\Desktop
        File desktopFile = FileSystemView.getFileSystemView().getHomeDirectory();
        //创建子进程输出信息的存放文件,文件不存在时,会自动创建
        File outputFile = new File(desktopFile, "output.txt");
        //返回此流程构建器的标准输出目标,意思是将来输出信息全部放在这个目标中
        processBuilder = processBuilder.redirectOutput(outputFile);
        processBuilder.start();//启动进程构建器
        logger.info("子进程执行消息存放在:" + processBuilder.redirectOutput().file().getPath());

4)directory(File directory)  设置此进程构建器的工作目录,注意它是为参数列表中程序参数设置工作目录,而不是程序的工作目录,下面通过实例理解。

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
 * Created by Administrator on 2019/2/26 0026.
public class APITest {
    private static final Logger logger = Logger.getGlobal();//日志记录器
    public static void main(String[] args) throws IOException {
        List<String> paramList = new ArrayList<>();
        paramList.add("C:/windows/system32/notepad.exe");//启动系统的记事本,第一个参数必须是可执行程序
        //打开 E:/wmx/test/123.txt 文件,文件必须存在
        //应该在 start 之前切换工作目录到 E:/wmx/test
        paramList.add("123.txt");
        ProcessBuilder pb = new ProcessBuilder(paramList);
        //切换进程构建器的工作目录到 E:/wmx/test 下,这样上面才能简写 123.txt时找到文件
        //必须注意的是 directory 是为paramList中的参数 "123.txt" 设置的工作目录,,而不是程序 "C:/windows/system32/notepad.exe"
        //程序要么就是写全路径,要么就是配置系统环境变量才能写简称,如 calc、notepad 等
        pb.directory(new File("E:/wmx/test/"));
        pb.start();//开启子进程
        logger.info(pb.directory() + ":当前工作目录");//默认情况下,未设置时,输出为 null

路径空格说明

1)如下使用 Office 的 Word.exe 打开一个 docx 文件,Word.exe 与 .docx 文件路径有空格都是可以的,Word.exe 与 .docx 分别占一个元素:

正确:[cmd, /c, C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE, E:\wmx\MR软件说明书.docx]

2)如下使用 PotPlayer 播放一个 mp4文件,mp4文件路径含有空格,可以将空格路径作为一个元素,也可以将路径空格位置切分为多个元素:
正确:[cmd, /c, D:\PotPlayer\PotPlayerMini.exe, E:\wmx\w s\sh k\8.mp4]
正确:[cmd, /c, D:\PotPlayer\PotPlayerMini.exe, E:\wmx\w, s\sh, k\8.mp4]

3)如下的本意是想让 Chrome 浏览器全屏模式打开一个地址,因为 --kiosk 与后面的浏览器地址一共是两个参数,所以写法一正确,写法二错误。

正确:[cmd, /c, C:/Program Files (x86)/Google/Chrome/Application/chrome.exe, --kiosk, http://www.baidu.com]
错误:[cmd, /c, C:/Program Files (x86)/Google/Chrome/Application/chrome.exe, --kiosk http://www.baidu.com]

目录ProcessBuilder 概述方法概述API 测试路径空格说明ProcessBuilder 概述1、public final class java.lang.ProcessBuilder extends Object :此类用于创建操作系统进程。2、每个 ProcessBuilder 实例管理一个进程属性集,start() 方法利用这些属性创建一个新的 Pro... 原文链接:Java Process详解及实例_JAVA教程_服务器之家 Java可以通过Runtime来调用其他进程,如cmd命令,shell文件的执行等。可以应该该类设置系统时间,执行shell文件。此处记录几个有用应用如下。 设置本地时间 可以调用cmd /c date命令,完成本地时间设置,不过这 类 ProcessBuilder 原文链接:https://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/lang/ProcessBuilder.html java.lang.Object java.lang.ProcessBuilder public final class ProcessBuilder extends Object 此类用于创建操作系统进程。 每个ProcessBu.
ProcessBuilder用法示例 ProcessBuilder()类用于创建操作系统进程,提供一种启动和管理进程的方法。每个 ProcessBuilder 实例管理一个进程属性集,start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。在调用 waitFor() 的时候, Process 需要向主线程汇报运行状况,所以要注意清空缓存区,即 InputStream 和 ErrorStream 。 //利用指定的
ArrayList<String> convert = new ArrayList<String>(); convert.add("ffmpeg -y -i C:/Users/fang/Desktop/1.m4a -ar 8000 -acodec mp3 C:/Users/fang/Desktop/5.mp3"); ProcessBuilder builder = new ProcessBuilder(); try { builder.co.
### 回答1: 操作系统是计算机系统中的一种重要软件,负责管理计算机的资源和控制程序的执行。进程操作系统中的基本执行单位,是程序在计算机上的一次执行过程。下面我将详细介绍一个使用Java代码进行的操作系统进程实验。 在该实验中,我们可以使用Java的ProcessBuilder类来创建和控制操作系统进程。下面是一个简单的示例代码: ```java import java.io.IOException; public class ProcessExperiment { public static void main(String[] args) { ProcessBuilder processBuilder = new ProcessBuilder("notepad.exe"); try { Process process = processBuilder.start(); // 启动操作系统进程 int exitCode = process.waitFor(); // 等待进程结束,并获取结束码 System.out.println("进程结束,退出码:" + exitCode); } catch (IOException | InterruptedException e) { e.printStackTrace(); 上述代码使用ProcessBuilder创建了一个操作系统进程,并指定了要执行的程序为记事本(notepad.exe)。通过调用start()方法启动进程,然后调用waitFor()方法等待进程结束。最后,我们可以获取进程的退出码,该码用于表示进程执行的结果。 当我们运行上述代码时,操作系统创建一个新的记事本进程,并在后台执行。当我们关闭记事本后,进程结束,程序将打印出进程的退出码。 这个实验只是一个简单的例子,但在实际的操作系统开发中,我们可以使用Java代码创建和控制各种类型的进程,如运行其他程序、执行系统命令等。操作系统进程的管理和调度是计算机系统中非常重要的任务,通过编写Java代码实现操作系统进程的控制,可以更好地理解和学习操作系统的原理和机制。 ### 回答2: 操作系统进程是计算机中的一种抽象概念,用来表示正在运行的程序。通过使用Java代码来模拟操作系统进程,我们可以更好地理解进程管理的概念。 在Java中,我们可以使用Thread类来创建和管理进程。以下是一个简单的示例代码: ```java public class ProcessSimulation extends Thread { private String processName; public ProcessSimulation(String name) { this.processName = name; public void run() { System.out.println("进程" + processName + "开始运行"); // 执行进程的具体操作 try { Thread.sleep(1000); // 模拟进程的执行时间 } catch (InterruptedException e) { e.printStackTrace(); System.out.println("进程" + processName + "运行结束"); public static void main(String[] args) { ProcessSimulation process1 = new ProcessSimulation("进程1"); ProcessSimulation process2 = new ProcessSimulation("进程2"); process1.start(); process2.start(); 在这个示例中,我们创建了一个名为ProcessSimulation的类,继承自Thread类。每个ProcessSimulation对象表示一个进程。在run()方法中,我们定义了进程的操作,可以在其中执行一些实际的任务。通过调用Thread的start()方法,我们启动进程。 在main()方法中,我们创建了两个进程对象process1和process2,并分别调用它们的start()方法开始运行。每个进程的执行时间设置为1秒,然后打印出进程的名称表示运行结束。 通过这个示例,我们模拟了操作系统中的进程管理过程,展示了进程创建和调度。当然,实际的操作系统进程管理更加复杂,但这个代码示例可以帮助我们更好地理解进程的概念和基本原理。