ProcessBuilder 和 Runtime(转)

简介: ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例,该实例可用来控制进程状态并获得相关信息。

 

ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例,该实例可用来控制进程状态并获得相关信息。

Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin、stdout 和 stderr)操作都将通过三个流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子 进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。 当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。 对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。

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

不同点:
ProcessBuilder.start() 和 Runtime.exec()传递的参数有所不同,Runtime.exec()可接受一个单独的字符串,这个字符串是通过空格来分隔可执行命令程序和参数的;也可以接受字符串数组参数。而ProcessBuilder的构造函数是一个字符串列表或者数组。列表中第一个参数是可执行命令程序,其他的是命令行执行是需要的参数。
通过查看JDK源码可知,Runtime.exec最终是通过调用ProcessBuilder来真正执行操作的。

import java.io.BufferedReader;   
import java.io.File;   
import java.io.IOException;   
import java.io.InputStream;   
import java.io.InputStreamReader;   
import java.util.Map;   
  
public class ProcessBuilderTest {   
    public static void restart() throws IOException {   
        // Runtime 例子   
        Process p;   
        // test.bat中的命令是ipconfig/all   
        String cmd = "c:\\test\\test.bat";   
  
        try {   
            // 执行命令   
            p = Runtime.getRuntime().exec(cmd);   
            // 取得命令结果的输出流   
            InputStream fis = p.getInputStream();   
            // 用一个读输出流类去读   
            InputStreamReader isr = new InputStreamReader(fis);   
            // 用缓冲器读行   
            BufferedReader br = new BufferedReader(isr);   
            String line = null;   
            // 直到读完为止   
            while ((line = br.readLine()) != null) {   
                System.out.println(line);   
            }   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
  
        // ProcessBuilder 例子 Java程序自重启   
        // 用一条指定的命令去构造一个进程生成器   
        ProcessBuilder pb = new ProcessBuilder("java", "-jar", "Test3.jar");   
        // 让这个进程的工作区空间改为F:\dist   
        // 这样的话,它就会去F:\dist目录下找Test.jar这个文件   
        pb.directory(new File("F:\\dist"));   
        // 得到进程生成器的环境 变量,这个变量我们可以改,   
        // 改了以后也会反应到新起的进程里面去   
        Map<String, String> map = pb.environment();   
        Process p1 = pb.start();   
        // 然后就可以对p做自己想做的事情了   
        // 自己这个时候就可以退出了   
        System.exit(0);   
    }   
} 

http://blog.sina.com.cn/s/blog_9d38f2eb01014ocl.html#

 

目录
相关文章
|
自然语言处理 数据可视化 Java
Spring Data Elasticsearch 聚合查询
如需要统计某件商品的数量,最高价格,最低价格等就用到了聚合查询,就像数据库中的group by
681 0
|
8月前
|
人工智能 IDE 程序员
凌晨三点,你的眼睛还撑得住吗?——聊聊程序员「夜战」的真实成本!
当代程序员每日盯屏超10小时,眼睛疲劳、注意力分散成常态。本文从真实体验出发,探讨如何通过“为程序员定制”的显示器(如明基RD280U),以3:2画幅、编程色彩模式、MoonHalo护眼背光、KVM多设备协同等设计,系统性缓解暗光刺眼、蓝光伤眼、频繁切换等痛点,让屏幕真正服务于专注与健康——因为代码可重构,眼睛不能。
527 1
凌晨三点,你的眼睛还撑得住吗?——聊聊程序员「夜战」的真实成本!
|
6月前
|
人工智能 运维 供应链
制造企业RPA选型不踩坑:从场景落地到产品推荐,这篇全说透
凌晨两点,制造企业仍陷在手工录入、数据孤岛与重复劳动中。RPA以“数字员工”身份破局,实现财务、生产、供应链等多环节自动协同,降本增效、零误差、可追溯。实在智能实在Agent融合大模型,让“一句话”即可完成复杂流程,助力企业迈向智能自动化新时代。
768 6
|
9月前
|
监控 安全 数据挖掘
淘宝/天猫:使用优惠券发放API设计满减活动,刺激消费欲望
本文介绍如何利用淘宝/天猫优惠券发放API设计满减活动,通过动态发放、自定义规则提升转化率与客单价。结合行为经济学原理,详解满减逻辑、消费刺激机制,并提供Python代码示例,助力商家自动化营销,实现GMV增长。(238字)
|
11月前
|
存储 数据安全/隐私保护 芯片
U盘突然读不出来?教你几招轻松解决问题
U盘不识别怎么办?可能是接口问题、系统异常或U盘损坏。先换接口或电脑尝试,再检查磁盘管理与设备管理器,确认是否识别。若提示格式化,勿急操作,先恢复数据再格式化。如无法格式化,可能是硬件故障,建议寻求专业帮助。教你一步步排查与修复,保障数据安全!
|
Linux Windows
幻兽帕鲁服务端性能优化mod
这是一个非官方的《PalWorld》服务器Mod,主要用于修复内存泄漏和高CPU负载问题。目前可能存在未知Bug,建议备份游戏数据后自行测试。下载后,根据系统不同,替换对应路径下的文件即可使用。Windows路径为`PalServer\Pal\Binaries\Win64\`,Linux路径为`pal\pal\binaries\Linux\`。更多详情可访问Github或哔哩哔哩提供的下载地址。
489 9
|
Prometheus 监控 Cloud Native
在Linux中,有过哪些网络监控工具?
在Linux中,有过哪些网络监控工具?
|
存储 关系型数据库 PostgreSQL
PostgreSQL有何特点?
【8月更文挑战第5天】PostgreSQL有何特点?
849 6
|
Web App开发 JavaScript 前端开发
Express 框架的特点、使用方法以及相关的常用功能和中间件
Express 框架的特点、使用方法以及相关的常用功能和中间件
898 1