博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java调用exe
阅读量:4362 次
发布时间:2019-06-07

本文共 5209 字,大约阅读时间需要 17 分钟。

前言:最近做了一个Java跨平台开启,关闭,重启nginx的功能,在Java操作exe上遇到了一些问题,下面是对这个问题一个总结

一、Java操作exe的三种方式

(1)Runtime.getRuntime

Process proc = Runtime.getRuntime().exec("java");

 

/**     * cmd方式     * @param command  要执行的命令     */    private static void test1() {        BufferedReader bufferedReader = null;        try {            String command = "cmd /c start nginx";//要执行的命令            String path = "D:/workspace-mars-2019-app/ywpt/nginx/windows";//打开文件的位置            File exeFile = new File(path);            String[] str = new String[] {};//参数                        // 执行命令返回执行的子进程对象        //    Process proc = Runtime.getRuntime().exec(command,str,exeFile);            Process proc = Runtime.getRuntime().exec("C:/Program Files (x86)/Notepad++/notepad++.exe");            // 获取子进程的错误流,并打印            bufferedReader = new BufferedReader(new InputStreamReader(proc.getErrorStream()));                        String line = null;            while ((line = bufferedReader.readLine()) != null) {                System.out.println(line);            }        } catch (Exception ex) {            ex.printStackTrace();        } finally {            if (bufferedReader != null) {                try {                    bufferedReader.close();                } catch (Exception ex) {                }            }        }    }

 

 

 

(2)ProcessBuilder

Process  proc =new ProcessBuilder("java").start();
/**     * ProcessBuilder调用cmd     */    private static void test2() {        BufferedReader bufferedReader = null;        try {            // 执行命令返回执行的子进程对象            Process proc = new ProcessBuilder("C:/Program Files (x86)/Notepad++/notepad++.exe").start();            // 获取子进程的错误流,并打印            bufferedReader = new BufferedReader(new InputStreamReader(proc.getErrorStream()));            String line = null;            while ((line = bufferedReader.readLine()) != null) {                System.out.println(line);            }        } catch (Exception ex) {            ex.printStackTrace();        } finally {            if (bufferedReader != null) {                try {                    bufferedReader.close();                } catch (Exception ex) {                }            }        }    }
/**     * ProcessBuilder打开nginx     * @throws IOException     */    private static void test7() {        BufferedReader bufferedReader = null;        ProcessBuilder pb = new ProcessBuilder("cmd ", "/c", "start nginx");        Map
env = pb.environment(); pb.directory(new File("D:/workspace-mars-2019-app/ywpt/nginx/windows")); try { Process proc = pb.start(); // 获取子进程的错误流,并打印 bufferedReader = new BufferedReader(new InputStreamReader(proc.getErrorStream())); String line = null; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } } catch (Exception ex) { ex.printStackTrace(); } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (Exception ex) { } } } }

 

(3)Desktop

Desktop.getDesktop().open(new File("D:/workspace-mars-2019-app/ywpt/nginx/windows/nginx.exe"));
/**     * getDesktop方式     *      * @throws IOException     */    private static void test3() throws IOException {        BufferedReader bufferedReader = null;        try {            Desktop.getDesktop().open(new File("C:/Program Files (x86)/Notepad++/notepad++.exe"));        } catch (Exception ex) {            ex.printStackTrace();        } finally {            if (bufferedReader != null) {                try {                    bufferedReader.close();                } catch (Exception ex) {                }            }        }    }

 

二、Process的使用

参考:

(1)简介:

Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序)。

       Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。

       ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。  

       创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。

       当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。

(2)主要方法

  1. InputStream getErrorStream() 获得子进程的错误流。
  2. InputStream getInputStream() 获得子进程的输入流。
  3. OutputStream getOutputStream() 获得子进程的输出流。

三、扩展

(1)Desktop打开指定文件

/**     * 打开指定文件     * @throws IOException     */    private static void test5() throws IOException {        File file=new File("e://error.log");         java.awt.Desktop.getDesktop().open(file);    }

(2)Desktop打开指定文件夹

/**     * 打开指定文件夹     * @throws IOException     */    private static void test6() throws IOException {        File file=new File("e://error.log");         java.awt.Desktop.getDesktop().open(file.getParentFile());    }

(3)Desktop打开指定文件

/**     * 打开指定文件     * @throws IOException     */    private static void test5() throws IOException {        File file=new File("e://error.log");         java.awt.Desktop.getDesktop().open(file);    }

 

转载于:https://www.cnblogs.com/excellencesy/p/11295054.html

你可能感兴趣的文章
Hadoop部署配置文件
查看>>
C++Josephus问题
查看>>
阿里云-域名免费申请ssl证书过程
查看>>
vue技术分享-你可能不知道的7个秘密
查看>>
android studio 2.2 使用cmake编译NDK
查看>>
解决Fragment中使用ViewPager时,ViewPager里的Fragment错位和空白问题
查看>>
Android SurfaceView实战 打造抽奖转盘
查看>>
SQL查询原理及执行顺序
查看>>
浅拷贝深拷贝Python对象的拷贝
查看>>
列表代码我的第一个封装js代码-----展开收起效果
查看>>
SpringMVC request生命周期
查看>>
5_4学生类
查看>>
位图排序(位图技术应用)
查看>>
再谈Delphi vs VC++(非常精彩)
查看>>
iPadはディスプレイサイズは変わらないものの底面の厚みが増す攻略
查看>>
最短路算法
查看>>
171204 行车路线 ccf
查看>>
深入浅出通信原理连载22-40(Python代码版)
查看>>
SQLServer2012书学习第四章
查看>>
4.2文件格式分析
查看>>