前言:最近做了一个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<String, String> 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的使用

参考:https://www.cnblogs.com/hero4china/archive/2012/08/15/2640062.html

(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);
}

java调用exe的更多相关文章

  1. 使用Java调用exe可执行文件

    一.出发点 平日里,我们看到了很多已经成型的可执行文件,而且经过了一定的封装.因为开源的关系,大多时候可以自己使用eclipse进行编译,但也常常遇到不如直接调用更加方便的情况.那么这时候,我个人需要 ...

  2. java调用exe,及调用bat不成功的解决办法

    开门见山的说,文件目录如下 想调用123.exe,但是尝试了几次调用不到,然后写了个bat.初始内容如下 @echo off D: cd test "123.exe" 双击可以运行 ...

  3. JAVA 调用exe程序执行对应的文件 (个人用于编译Java文件)

    需求: 需要利用Java程序,来调用计算机本身的黑窗口,来将特定的Java文件编译成对应的字节码文件. 实现思路: 通过调用Java的Runtime类,每个 Java 应用程序都有一个 Runtime ...

  4. windows下Java调用可执行文件

    缘起: 由于没有找到java转换文件的接口,因此使用java调用exe文件进行文件转换 public void convertFile(){ Runtime rn = Runtime.getRunti ...

  5. 使用java传参调用exe并且获取程序进度和返回结果的一种方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在某个项目中需要考虑使用java后台调用由C#编写的切图程序( ...

  6. windows文本转语音 通过java 调用python 生成exe可执行文件一条龙

    我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...

  7. java调用matlab生成exe文件

    一.Matlab生成Java Package 1.在MATLAB的Command Window输入deploytool命令,选择Library Compiler. 2.在弹出的窗口选择Java Pac ...

  8. java调用mysql服务做备份与恢复

    首先添加mysql的bin到环境变量,这样可以简写部分命令,并且做到不依赖系统mysql的具体安装路径. 重启计算机可以让添加的环境变量在java代码中调用时生效.(cmd中生效但java中调用没有生 ...

  9. c++ c# java 调用 c++ 写的dll

    1. vs 中新建win32 dll 项目   testdll 添加实现文件       test.cpp #include "stdafx.h" #include <ios ...

随机推荐

  1. 【资源分享】CS起源 V34.4044(经典版本)

    *----------------------------------------------[下载区]----------------------------------------------* ...

  2. [AGC027C]ABland Yard

    Description AGC027C 给定一张图,点有标号A或B,计算是否对于任意的一个由AB构成的字符串都在图中有对应的路径. Solution 观察可以发现,如果有个环(不一定是简单环)是AAB ...

  3. thinkphp的where 之 or的使用

    需要生成 SELECT * FROM `goods` WHERE ( `goodstype_id` = 2 or `goodstype_id` = 3 ) $where['goodstype_id'] ...

  4. luckyframe的一些坑

    建议使用idea运行 1.第一次运行访问http://localhost:8088/LuckyFrameServer 2.luckyframe提示“javax.net.ssl.SSLKeyExcept ...

  5. AcWing 851. spfa求最短路 边权可能为负数。 链表 队列

    #include <cstring> #include <iostream> #include <algorithm> #include <queue> ...

  6. Caffe 笔记 (一)caffe的层与数据结构

    Caffe是纯粹的C++/CUDA架构,支持命令行.Python和MATLAB接口:可以在CPU和GPU直接无缝切换: Caffe::set_mode(Caffe::GPU); Caffe的优势 1. ...

  7. Abaqus 载荷分类(部分)

    目录 1. 集中载荷 1.1 集中载荷施加方法 1.2 定义集中跟随力 1.3 指定文件定义集中节点力 2. 分布载荷 2.1 分布载荷分类 3. 热载荷 3.1 模拟热辐射 3.2 直接定义热流量 ...

  8. Debian 系统修改网卡ens33名称为 eth0

    1. 编辑文件 /etc/default/grub 修改下面的值 初始值 GRUB_CMDLINE_LINUX="" 修改后 GRUB_CMDLINE_LINUX="ne ...

  9. cJson 常见用法

    cJson是一个非常轻量级的JSON数据解析和构建的oss. 可以很容易的的在C代码中构建一个JSON格式的字符串.也可以将JSON字符串转成cJson中定义的cJson object. 通常用在,手 ...

  10. 67课 for循环1-为什么需要for循环

    # include <stdio.h> int main (void) { int i; ;.//sum代表和的意思 ; i<=; ++i)//第八行代码 sum = sum + i ...