搜索
首页Javajava教程Java怎么实现调用外部程序
Java怎么实现调用外部程序May 20, 2023 pm 11:04 PM
java

    在Java中,可以通过Runtime类ProcessBuilder类来实现调用外部程序。

    Runtime类与ProcessBuilder类

    使用Runtime类:

    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec("外部程序路径");

    使用ProcessBuilder类:

    ProcessBuilder builder = new ProcessBuilder("外部程序路径");
    Process process = builder.start();

    参数传递

    以上两种方法均可启动一个外部进程。如果需要向外部进程传递参数,可以在exec() 或ProcessBuilder构造函数中传递字符串数组

    String[] cmdarray = {"外部程序路径", "参数1", "参数2"};Process process = runtime.exec(cmdarray);

    执行结果

    外部进程的返回结果可以通过process对象获取。可以使用getInputStream() 方法读取外部进程的标准输出流,或者使用getErrorStream() 方法读取错误输出流。

    InputStream inputStream = process.getInputStream(); // 标准输出流
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line); // 输出每行结果
    }

    注意:在调用外部程序时一定要小心,因为它可能会引起安全问题和系统崩溃等异常情况。建议使用该功能时对外部程序进行充分的测试和验证

    Runtime类的使用

        @Test
        public void runtimeTest() {
            try {
                //获取执行进程
                Runtime runtime = Runtime.getRuntime();
                Process process = runtime.exec("ipconfig");
                //读取输入流
                InputStream inputStream = process.getInputStream();
                //将字节流转成字符流
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk");
                //字符缓冲区
                char[] c = new char[1024];
                int len = -1;
                while ((len = inputStreamReader.read(c)) != -1) {
                    String s = new String(c, 0, len);
                    System.out.print(s);
                }
                inputStream.close();
                inputStreamReader.close();
                //阻塞当前线程,直到进程退出为止
                process.waitFor();
                int exitValue = process.exitValue();
                if (exitValue == 0) {
                    System.out.println("进程正常结束");
                } else {
                    System.out.println("进程异常结束");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    Java怎么实现调用外部程序

    ProcessBuilder类的使用

    无参数调用

    @Test
        public void processBuilderTest1() {
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.command("java");
            //将标准输入流和错误输入流合并,通过标准输入流读取信息
            processBuilder.redirectErrorStream(true);
            try {
                //启动进程
                Process start = processBuilder.start();
                //获取输入流
                InputStream inputStream = start.getInputStream();
                //转成字符输入流
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk");
                int len = -1;
                //字符缓冲区
                char[] c = new char[1024];
                //读取进程输入流中的内容
                while ((len = inputStreamReader.read(c)) !=-1){
                    String s = new String(c, 0, len);
                    System.out.print(s);
                }
                inputStreamReader.close();
                inputStream.close();
                //阻塞当前线程,直到进程退出为止
                start.waitFor();
                int exitValue = start.exitValue();
                if (exitValue == 0) {
                    System.out.println("进程正常结束");
                } else {
                    System.out.println("进程异常结束");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    Java怎么实现调用外部程序

    简单参数调用

    processBuilder.command("java","-version");

    Java怎么实现调用外部程序

    复杂参数调用

     List<String> command = new ArrayList<>();
            command.add("java");
            command.add("-version");
            processBuilder.command(command);

    Apache Commons Exec库

    Apache Commons Exec 是一个用于执行外部进程的 Java 库,可以方便地启动和控制进程,并且提供了对输入、输出流的管理和处理

    使用步骤介绍

    1.添加依赖,将Apache Commons Exec库添加到项目中

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-exec</artifactId>
                <version>1.3</version>
            </dependency>

    2.构造命令行对象:通过 CommandLine 对象构造需要执行的外部程序和参数。

    CommandLine cmdLine = CommandLine.parse("command argument1 argument2");

    可以重写为: 创建执行器对象需要使用 DefaultExecutor 对象,并且可以根据需要设置工作目录。

    DefaultExecutor executor = new DefaultExecutor();
    executor.setWorkingDirectory(new File("/your/workdir"));

    4.创建处理器对象:PumpStreamHandler 对象可以处理输入输出流并存储进程的标准输出和标准错误信息。

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
    executor.setStreamHandler(streamHandler);

    调用executor.execute方法来执行命令并等待进程结束。调用 process.waitFor() 来等待进程执行完成后再继续执行对应的操作。执行完成后处理 outputStream 中的输出结果。

    executor.execute(cmdLine);
    String output = outputStream.toString("UTF-8");
    System.out.println(output);

    使用实例

        public static void main(String[] args) throws IOException {
            CommandLine cmdLine = CommandLine.parse("java -version");
            DefaultExecutor executor = new DefaultExecutor();
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
            executor.setStreamHandler(streamHandler);
            executor.execute(cmdLine);
            String output = outputStream.toString("UTF-8");
            System.out.println(output);
        }

    执行输出结果:

    java version "1.8.0_271"
    Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
    Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

    以上是Java怎么实现调用外部程序的详细内容。更多信息请关注PHP中文网其他相关文章!

    声明
    本文转载于:亿速云。如有侵权,请联系admin@php.cn删除
    带你搞懂Java结构化数据处理开源库SPL带你搞懂Java结构化数据处理开源库SPLMay 24, 2022 pm 01:34 PM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

    Java集合框架之PriorityQueue优先级队列Java集合框架之PriorityQueue优先级队列Jun 09, 2022 am 11:47 AM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

    完全掌握Java锁(图文解析)完全掌握Java锁(图文解析)Jun 14, 2022 am 11:47 AM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

    一起聊聊Java多线程之线程安全问题一起聊聊Java多线程之线程安全问题Apr 21, 2022 pm 06:17 PM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

    Java基础归纳之枚举Java基础归纳之枚举May 26, 2022 am 11:50 AM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

    详细解析Java的this和super关键字详细解析Java的this和super关键字Apr 30, 2022 am 09:00 AM

    本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

    Java数据结构之AVL树详解Java数据结构之AVL树详解Jun 01, 2022 am 11:39 AM

    本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

    一文掌握Java8新特性Stream流的概念和使用一文掌握Java8新特性Stream流的概念和使用Jun 23, 2022 pm 12:03 PM

    本篇文章给大家带来了关于Java的相关知识,其中主要整理了Stream流的概念和使用的相关问题,包括了Stream流的概念、Stream流的获取、Stream流的常用方法等等内容,下面一起来看一下,希望对大家有帮助。

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热门文章

    R.E.P.O.能量晶体解释及其做什么(黄色晶体)
    3 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳图形设置
    3 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您听不到任何人,如何修复音频
    3 周前By尊渡假赌尊渡假赌尊渡假赌

    热工具

    SublimeText3 英文版

    SublimeText3 英文版

    推荐:为Win版本,支持代码提示!

    螳螂BT

    螳螂BT

    Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

    Atom编辑器mac版下载

    Atom编辑器mac版下载

    最流行的的开源编辑器

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)