Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令 短命女 2024-03-16 19:02 16阅读 0赞 **目录** ProcessBuilder类的介绍及使用 【前言】 【正文】 \--构造方法-- \--常用方法-- \--使用技巧-- \--调用本地Shell命令,实例\-- 【总结】 【注意】 -------------------- ## ProcessBuilder类的介绍及使用 ## ### 【前言】 ### 在做一个项目的时候需要用到运行时动态执行JAVA命令,一开始的思路是运行时生成bat脚本,然后通过Runtime类的exec方法之行bat脚本,但是此方法不好的地方在于脚本执行时会弹出一个cmd程序界面框。后面在参考YANG的源码时发现了另一种运行时执行JAVA命令的方法,由此延申,了解了PorcessBuilder类的作用及用法。 ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。 ### 【正文】 ### ProcessBuilder类是java.lang包下的基础类,在使用时无需导入,可以直接使用。它主要用于创建和运行各类外部程序,例如javac,java等等。 #### \--构造方法-- #### 它(List<String> command),它(String... command) #### \--常用方法-- #### void command(String... command) 用于将待执行命令及参数传递给它; Process start() 执行命令并返回一个Process对象,用于获取对执行程序的输入和输出; void directory(File base) 用于设置待执行命令的工作目录,可以不设置; // 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() #### \--使用技巧-- #### 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(); ...... 添加一个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"); } #### 调用本地FFMPEG命令,实例: #### ![f1901d1b243e4eb9a7c3bb8f327b38a3.png][] ### 【总结】 ### 它作为一个JAVA底层类,使开发者能够与操作系统进行强大的互动,而且在使用它进行系统命令的调用时,能够在后台进行,不会有使用Runtime类时弹出cmd命令执行框的困扰,十分方便。在后面的学习当中可以进一步了解一下System类的用法。 ### 【注意】 ### 在用Runtime.getRuntime().exec()或ProcessBuilder(array).start()创建子进程Process之后,一定要及时取走子进程的输出信息和错误信息,否则输出信息流和错误信息流很可能因为信息太多导致被填满,最终导致子进程阻塞住,然后执行不下去。 典型用法应该为: ![7024e4c2c3dd46ba8c51b5e482f5d4e4.png][] [参考:Java进程Runtime、Process、ProcessBuilder调用外部程序\_程序猿架构的博客-CSDN博客][Java_Runtime_Process_ProcessBuilder_-CSDN] -------------------- 如果本篇文章对你有帮助的话,很高兴能够帮助上你。 当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。 [f1901d1b243e4eb9a7c3bb8f327b38a3.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/f9de5acc1bef461ca781cadfc3aac1bd.png [7024e4c2c3dd46ba8c51b5e482f5d4e4.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/15/9b1861b5ca4a456cac8c15bc991fca34.png [Java_Runtime_Process_ProcessBuilder_-CSDN]: https://blog.csdn.net/c315838651/article/details/72085739?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-72085739-blog-79917368.235%5Ev38%5Epc_relevant_sort&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-72085739-blog-79917368.235%5Ev38%5Epc_relevant_sort&utm_relevant_index=2
相关 Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令 目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 \--构造方法-- \--常用方法-- \--使用技巧-- \--调用本地Shell命令,实 短命女/ 2024年03月16日 19:02/ 0 赞/ 17 阅读
相关 php执行外部命令linux命令方式介绍 一、PHP中调用外部命令介绍 二、关于安全问题 三、关于超时问题 四、关于PHP运行linux环境中命令出现的问题 一、PHP中调用外部命令介绍 在PHP中调用 我就是我/ 2023年10月03日 12:41/ 0 赞/ 32 阅读
相关 Java ProcessBuilder类学习 文章目录 一、ProcessBuilder基础 1、ProcessBuilder类 1.1 概述 1.2 进程 怼烎@/ 2023年09月30日 13:48/ 0 赞/ 11 阅读
相关 java ProcessBuilder 文章目录 java ProcessBuilder code java ProcessBuilder code public 旧城等待,/ 2023年06月27日 03:08/ 0 赞/ 18 阅读
相关 Java ProcessBuilder示例 在Java中,我们可以使用`ProcessBuilder`轻松调用外部命令: ProcessBuilder processBuilder = new ProcessB 布满荆棘的人生/ 2023年02月15日 05:10/ 0 赞/ 10 阅读
相关 JDK5.0新特性系列 使用ProcessBuilder执行本地命令 / 在J2SE5.0之前使用Runtime的exec方法执行本地命令. 在J2Se5.0之后,可以使用ProcessBuilder执行本地命令 傷城~/ 2022年08月10日 14:47/ 0 赞/ 69 阅读
相关 Java——ProcessBuilder类的使用及获取APK信息 这次是想获取APK包的版本号,包名,大小等信息。其实有两种方法: 一种是: [纯JAVA环境获取APK信息(包名,版本,版本号,大小,权限...),纯JAV 素颜马尾好姑娘i/ 2022年08月05日 12:18/ 0 赞/ 185 阅读
相关 ProcessBuilder 用法详解 原文:https://blog.csdn.net/zhoujing\_0424/article/details/79917368 1. 简介 ProcessBuilde 超、凢脫俗/ 2022年01月06日 14:43/ 0 赞/ 675 阅读
相关 JavaSE_指令_ProcessBuilder JavaSE\_指令\_ProcessBuilder 说明 示例代码 场景 实现 说明 此类用于创建操作系统进程。 每个 ╰半夏微凉°/ 2021年10月06日 03:50/ 0 赞/ 304 阅读
还没有评论,来说两句吧...