java调用exe
前言:最近做了一个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)主要方法
- InputStream getErrorStream() 获得子进程的错误流。
- InputStream getInputStream() 获得子进程的输入流。
- 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的更多相关文章
- 使用Java调用exe可执行文件
一.出发点 平日里,我们看到了很多已经成型的可执行文件,而且经过了一定的封装.因为开源的关系,大多时候可以自己使用eclipse进行编译,但也常常遇到不如直接调用更加方便的情况.那么这时候,我个人需要 ...
- java调用exe,及调用bat不成功的解决办法
开门见山的说,文件目录如下 想调用123.exe,但是尝试了几次调用不到,然后写了个bat.初始内容如下 @echo off D: cd test "123.exe" 双击可以运行 ...
- JAVA 调用exe程序执行对应的文件 (个人用于编译Java文件)
需求: 需要利用Java程序,来调用计算机本身的黑窗口,来将特定的Java文件编译成对应的字节码文件. 实现思路: 通过调用Java的Runtime类,每个 Java 应用程序都有一个 Runtime ...
- windows下Java调用可执行文件
缘起: 由于没有找到java转换文件的接口,因此使用java调用exe文件进行文件转换 public void convertFile(){ Runtime rn = Runtime.getRunti ...
- 使用java传参调用exe并且获取程序进度和返回结果的一种方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在某个项目中需要考虑使用java后台调用由C#编写的切图程序( ...
- windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...
- java调用matlab生成exe文件
一.Matlab生成Java Package 1.在MATLAB的Command Window输入deploytool命令,选择Library Compiler. 2.在弹出的窗口选择Java Pac ...
- java调用mysql服务做备份与恢复
首先添加mysql的bin到环境变量,这样可以简写部分命令,并且做到不依赖系统mysql的具体安装路径. 重启计算机可以让添加的环境变量在java代码中调用时生效.(cmd中生效但java中调用没有生 ...
- c++ c# java 调用 c++ 写的dll
1. vs 中新建win32 dll 项目 testdll 添加实现文件 test.cpp #include "stdafx.h" #include <ios ...
随机推荐
- Day4 注解 泛型
注解是什么 注释是绑定到程序源代码元素的元数据,对它们运行的代码的操作没有影响. https://blog.csdn.net/SDDDLLL/article/details/93509699 他们 ...
- testng的注解
今天又学了点testng的新知识.原来在testng执行用例时,同一个class中的各个method按照字母顺序执行.为了实现自定义顺序执行,怎么办呢? 加入注解priority,举例如下: http ...
- awk从放弃到入门(2):awk分隔符
一.awk分隔符 awk的默认分割符是空格,但是,这样描述并不精确,因为,awk的分隔符还分为两种,"输入分隔符" 和 "输出分隔符" . (1)输入分隔符:英 ...
- Win10 系统运行VsCode出现白屏的问题(亲测有效)
Win10 系统运行VsCode出现白屏的问题(亲测有效) 新买的本本,昨天VScode运行还正常,今天打开一直白屏,什么都没有,只有几个小格格,也不是卡死的那种,可以轻松关闭, 刚开始以为版本问题, ...
- php对字符串的操作4之 字符串的格式化函数
strtolower($str ) strtoupper($str ) 大小写转换 strtotime('2018-1-1 0:0') 字符串转时间戳 date('Y-m-d H:i:s',time( ...
- Python基础知识详解 从入门到精通(七)类与对象
本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...
- 线索二叉树的详细实现(C++)
线索二叉树概述 二叉树虽然是非线性结构,但二叉树的遍历却为二又树的结点集导出了一个线性序列.希望很快找到某一结点的前驱或后继,但不希望每次都要对二叉树遍历一遍,这就需要把每个结点的前驱和后继信息记录下 ...
- Bugku-CTF加密篇之python(N1CTF) [HRlgC2ReHW1/WRk2DikfNBo1dl1XZBJrRR9qECMNOjNHDktBJSxcI1hZIz07YjVx]
python(N1CTF)
- Nuxt配置动态路由以及参数校验
动态路由就是带参数的路由.比如我们商品列表里很多商品详细页,这时候就需要动态路由的帮助了. 比如我们新建一个commodity文件夹,新建一个index.vue 文件,然后新建一个_id.vue (以 ...
- for语句处理多维数组
看C++Primer第三章看到的,记录一下. 下面这段代码非法,因为row指向的是每一行的一个大小为10的一维数组,默认转为指针,即row其实是一个int*类型的指针,显然内层循环就出错了 int a ...