Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

这篇具有很好参考价值的文章主要介绍了Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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命令,实例:

java processbuilder,Java,# Springboot,# FFMPEG,java,开发语言  

【总结】

它作为一个JAVA底层类,使开发者能够与操作系统进行强大的互动,而且在使用它进行系统命令的调用时,能够在后台进行,不会有使用Runtime类时弹出cmd命令执行框的困扰,十分方便。在后面的学习当中可以进一步了解一下System类的用法。

【注意】

在用Runtime.getRuntime().exec()或ProcessBuilder(array).start()创建子进程Process之后,一定要及时取走子进程的输出信息和错误信息,否则输出信息流和错误信息流很可能因为信息太多导致被填满,最终导致子进程阻塞住,然后执行不下去。

典型用法应该为:

java processbuilder,Java,# Springboot,# FFMPEG,java,开发语言

参考:Java进程Runtime、Process、ProcessBuilder调用外部程序_程序猿架构的博客-CSDN博客


如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。文章来源地址https://www.toymoban.com/news/detail-697232.html

到了这里,关于Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【solidity三】Solidity中继承、创建合约和外部调用、合约事件event、solidity中元祖的使用、new、delete关键字的使用、solisity创建合约和外部调用

    - 最重要的两个全局变量 msg.sender 每一次和以太坊交互时都会产生一笔交易,这笔交易的执行人就是msg.sender。简而言之:谁调用的,msg.sender就是谁,每笔交易的msg.sender都可以不同。举例: 部署合约的时候,msg.sender就是部署的账户。 调用setMessage时,msg.sender就是调用账户。

    2024年02月03日
    浏览(34)
  • 《string类的使用介绍》

    本文主要介绍string的常见的接口的使用 字符串是 表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器

    2024年02月03日
    浏览(29)
  • string类的使用方式的介绍

    目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类? 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象的访问及遍历操作 5.3.4 string类对象的修改操作

    2024年02月07日
    浏览(28)
  • 记一次使用hutool的http工具调用外部接口同步人员信息

    首先是TreeNodeVo实体 构建目录树的工具类 最后根据返回的集合生成目录结构,主要设置treenodevo对象的id,pid,value,lable参数 controller类 前端vue+elementui,用级联选择器显示目录树 data中添加treeNodeVos对象 methods中添加后台调用方法,此方法可以在点击页面加载时调用,看自己,还有

    2024年02月05日
    浏览(37)
  • String类的学习笔记(上):介绍String类及其常用方法的使用

    本文介绍了Java中用来描述操作字符串的String类,和其一些常用的基本操作方法,字符串的创建输出,字符串对象的比较,字符串查找,字符串的转化,字符串的替换,字符串拆分,字符串截取,和大小写转换,去除左右空格,子字符串包含,学会使用这些方法,能更方便的使用操作字符串~ 前言

    2023年04月23日
    浏览(41)
  • 淘宝商品API使用示例:如何通过调用外部API来获取淘宝商品价格销量主图详情数据

    淘宝上的商品信息量非常之大,商品的详情信息也很齐全。如何通过调用外部API来实现批量获取商品价格销量主图详情等信息呢?上周刚好完成了一个完整的淘宝商品采集项目,今天特来分享一下。 接口名称:item_get 请求地址:https://api-test.cn/taobao/item_get result_type:[json,jso

    2024年02月10日
    浏览(38)
  • C++ 学习 ::【基础篇:16】:C++ 类的基本成员函数:拷贝构造函数(认识、特征、注意点及典型使用场景)及其基本写法与调用

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段: 基础篇、STL 篇、高阶数据结构与算法篇 ,相关重点内容如下: 基础篇 : 类与对象 (涉及C++的三大特性等); STL 篇 : 学习使用 C++ 提供的 STL 相关库 ; 高阶数据结构与算

    2024年02月08日
    浏览(34)
  • 了解Java中ArrayList类的使用

    引言:         在Java中,ArrayList是一个非常常用的动态数组实现,它提供了一种灵活的方式来存储和操作数据集合。ArrayList是Java集合框架中的一部分,它允许我们在运行时动态地添加或删除数据,并提供了许多便利的方法来操作列表中的元素。         首先,让我们

    2024年01月19日
    浏览(25)
  • Java中Date时间类的使用

    目录 一、java.util.Date实例化介绍         一)、Date对象实例化         二)设置Date对象指定日期 :         三)将日期格式化输出为中文状态 二、方法介绍 三、方法演示 运行结果:         Date 类的无参数构造方法获取的是系统当前的时间,显示的顺序为

    2024年02月13日
    浏览(23)
  • 关于java中PriorityQueue类的使用方法

    今天做了力扣的每日一题 ==》 2208. 将数组和减半的最少操作次数  起初我用数组这个死方法去做这个题,代码写出来了,不过在最后运行的时候超时了。看大佬的解答中,我发现了这个类,之前从来都没看到过,所以学习了一下,写这篇文章记一下。 目录 前言 一、Priori

    2024年02月15日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包