ProcessBuilder类的介绍及使用_Process和ProcessBuilder入门 朴灿烈づ我的快乐病毒、 2023-09-30 13:47 20阅读 0赞 ## ProcessBuilder类的介绍及使用 ## ### 前言 ### 在做一个项目的时候需要用到运行时动态执行JAVA命令,一开始的思路是运行时生成bat脚本,然后通过Runtime类的exec方法之行bat脚本,但是此方法不好的地方在于脚本执行时会弹出一个cmd程序界面框。后面在参考YANG的源码时发现了另一种运行时执行JAVA命令的方法,由此延申,了解了PorcessBuilder类的作用及用法。 ### 正文 ### ProcessBuilder类是java.lang包下的基础类,在使用时无需导入,可以直接使用。它主要用于创建和运行各类外部程序,例如javac,java等等。 –构造方法– 它(List command),它(String… command) –常用方法– void command(String... command) 用于将待执行命令及参数传递给它; Process start() 执行命令并返回一个Process对象,用于获取对执行程序的输入和输出; void directory(File base) 用于设置待执行命令的工作目录,可以不设置; –使用技巧– 1、在使用它的时候建议将其封装一下,这样更便于使用,例如, public class ProcessUtil { public static void process(String... command) throws Exception { process((File)null, command); } public static void process(List<String> commandList) throws Exception { process((File)null, (String[])commandList.toArray(new String[0])); } public static void process(File base, String... command) throws Exception { ProcessBuilder processBuilder = new ProcessBuilder(new String[0]); if (base != null) { processBuilder.directory(base); } processBuilder.command(command); Process process = processBuilder.start(); ...... 1. 添加一个input2string()方法,用于将执行程序获得的输出转换为String对象,便于输出,例如, public static String input2str(InputStream inputStream) throws UnsupportedEncodingException { ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; try { int len; while((len = inputStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } outSteam.close(); inputStream.close(); } catch (IOException var5) { var5.printStackTrace(); } return outSteam.toString("utf-8"); } ### 总结 ### 它作为一个JAVA底层类,使开发者能够与操作系统进行强大的互动,而且在使用它进行系统命令的调用时,能够在后台进行,不会有使用Runtime类时弹出cmd命令执行框的困扰,十分方便。在后面的学习当中可以进一步了解一下System类的用法。 -------------------- -------------------- ## ProcessBuilder ## ### 1. 简介 ### ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。 每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。 ### 2. 示例 ### 下面是一个使用修改过工作目录和环境启动进程的例子,并重定向标准输出和标准错误到自定义日志文件。 ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2"); //设置环境变量,初始值是当前进程环境的一个副本System.getenv() Map<String, String> env = pb.environment(); env.put("VAR1", "myValue"); env.remove("OTHERVAR"); env.put("VAR2", env.get("VAR1") + "suffix"); //设置工作目录 pb.directory(new File("myDir")); File log = new File("log"); //redirectErrorStream 属性默认值为false,意思是子进程的标准输出和错误输出被发送给两个独立的流,这些流可以通过 Process.getInputStream() 和 Process.getErrorStream() 方法来访问。 //如果将值设置为 true,标准错误将与标准输出合并。这使得关联错误消息和相应的输出变得更容易。在此情况下,合并的数据可从 Process.getInputStream() 返回的流读取,而从 Process.getErrorStream() 返回的流读取将直接到达文件尾。 pb.redirectErrorStream(true); pb.redirectOutput(Redirect.appendTo(log)); //启动进程 Process p = pb.start(); assert pb.redirectInput() == Redirect.PIPE; //重定向标准输出到日志 assert pb.redirectOutput().file() == log; assert p.getInputStream().read() == -1; ### 3. ProcessBuilder API ### //构造方法 //利用指定的操作系统程序和参数构造一个进程生成器。 ProcessBuilder(List<String> command) //利用指定的操作系统程序和参数构造一个进程生成器。 ProcessBuilder(String… command) //方法 //返回此进程生成器的操作系统程序和参数。 command() //设置此进程生成器的操作系统程序和参数。 command(List<String> command) //设置此进程生成器的操作系统程序和参数。 command(String… command) //返回此进程生成器的工作目录。 directory() //设置此进程生成器的工作目录。 directory(File directory) //返回此进程生成器环境的字符串映射视图。 environment方法获得运行进程的环境变量,得到一个Map,可以修改环境变量 environment() //返回进程生成器是否合并标准错误和标准输出;true为合并,false为不合并 redirectErrorStream() //设置此进程生成器的 redirectErrorStream 属性。默认值为false不合并 redirectErrorStream(boolean redirectErrorStream) //使用此进程生成器的属性启动一个新进程。 start() ## Process和ProcessBuilder入门 ## java在本地执行命令时是否遇到过问题? 执行长输出的命令会卡住的情况,用Runtime.exe() 执行命令,当命令的输出过长时,会导致程序卡住,当时查的网上资料解决了这个问题,开启了2个线程,分别打印标准输出和标准错误输出,这样就能避免卡住。 Process 创建的是进程,因为在本地 ps 会看到一个执行的进程。 ### ProcessBuilder ### 1.概述 ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。 每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。 使用ProcessBuilder比使用Process的好处在于,我们不仅仅可以去执行一个应用程序,还可以对执行进程进行更多的管理工作,比如:获取进程的执行信息,包括标准输出、标准错误输出;设置当前工作目录;改变环境参数。 ProcessBuilder用于创建操作系统进程,每个ProcessBuilder实例都管理一个进程属性集合。通过调用start()方法,可以通过这些属性创建出一个进程。start()方法可以被多次调用,来创建多个独立的进程。 每个builder管理着下面的进程属性: **cmmand** 命令,比如\{“ipcofig”,“/all”\} **environment** 环境变量,子进程会直接使用当前进程的环境变量。环境变量是独立的,因此可以被修改,但是不会影响其他的进程。 **directory** 工作目录,如果返回的是Null,说明当前目录使用的是系统变量user.dir所在的目录。 **redirectErrorStream**属性 默认是false。Flase意味着标准输出和标准错误是两个独立的流,可以通过Process.getInputStream()和Process.getErrorStream()方法获得。 如果这个值设置为true,那么标准错误将会合并到标准输出中,并且发往同一个目标地址(这种特性使得错误消息可以很方便的和输出消息一起管理),此时,如果你再想要单独获取错误输出流,就会得到null。 **线程安全** 注意这个类不是线程安全的,因此如果多个线程使用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(new File("myDir")); File log = new File("log"); pb.redirectErrorStream(true); pb.redirectOutput(Redirect.appendTo(log)); Process p = pb.start(); assert pb.redirectInput() == Redirect.PIPE; assert pb.redirectOutput().file() == log; assert p.getInputStream().read() == -1; #### ProcessBuilder(XXX).start()和Runtime.exec(XXX)功能相同,主要优点在使用过程中感受有: #### * 前者是jdk1.5后的新方式 * 配置环境变量时更优雅 * 对当前目录的控制也更合理 * 错误流重定向特别方便 * 进程控制更简洁 **参考:** https://blog.csdn.net/qq\_21383435/article/details/82709284 https://blog.csdn.net/u013256816/article/details/54603910
相关 Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令 目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 \--构造方法-- \--常用方法-- \--使用技巧-- \--调用本地Shell命令,实 短命女/ 2024年03月16日 19:02/ 0 赞/ 55 阅读
相关 Java如何基于ProcessBuilder类调用外部程序 Java如何基于ProcessBuilder类调用外部程序 1. demo1 @Test public void testProcessBuild 比眉伴天荒/ 2023年09月30日 13:48/ 0 赞/ 21 阅读
相关 Java ProcessBuilder类学习 文章目录 一、ProcessBuilder基础 1、ProcessBuilder类 1.1 概述 1.2 进程 怼烎@/ 2023年09月30日 13:48/ 0 赞/ 42 阅读
相关 ProcessBuilder类的介绍及使用_Process和ProcessBuilder入门 ProcessBuilder类的介绍及使用 前言 在做一个项目的时候需要用到运行时动态执行JAVA命令,一开始的思路是运行时生成bat脚本,然后通过Runtime类 朴灿烈づ我的快乐病毒、/ 2023年09月30日 13:47/ 0 赞/ 21 阅读
相关 java ProcessBuilder 文章目录 java ProcessBuilder code java ProcessBuilder code public 旧城等待,/ 2023年06月27日 03:08/ 0 赞/ 56 阅读
相关 Java ProcessBuilder示例 在Java中,我们可以使用`ProcessBuilder`轻松调用外部命令: ProcessBuilder processBuilder = new ProcessB 布满荆棘的人生/ 2023年02月15日 05:10/ 0 赞/ 42 阅读
相关 Java——ProcessBuilder类的使用及获取APK信息 这次是想获取APK包的版本号,包名,大小等信息。其实有两种方法: 一种是: [纯JAVA环境获取APK信息(包名,版本,版本号,大小,权限...),纯JAV 素颜马尾好姑娘i/ 2022年08月05日 12:18/ 0 赞/ 220 阅读
相关 ProcessBuilder 用法详解 原文:https://blog.csdn.net/zhoujing\_0424/article/details/79917368 1. 简介 ProcessBuilde 超、凢脫俗/ 2022年01月06日 14:43/ 0 赞/ 714 阅读
相关 JavaSE_指令_ProcessBuilder JavaSE\_指令\_ProcessBuilder 说明 示例代码 场景 实现 说明 此类用于创建操作系统进程。 每个 ╰半夏微凉°/ 2021年10月06日 03:50/ 0 赞/ 334 阅读
还没有评论,来说两句吧...