java执行可执行文件

文章目录

    • 概要
    • 使用Runtime.exec
    • 使用ProcessBuilder
    • 使用第三方工具包commons-exec.jar

概要

java执行bat或shell脚本的方式主要有三种方式
1、 使用Runtime.exec
2、 使用ProcessBuilder
3、 使用第三方的工具包commons-exec.jar

使用Runtime.exec

在 Java 中,使用 Runtime.exec() 方法执行外部可执行文件是一个常见的做法。但是,这种方法有一些限制和潜在的问题,比如它不太容易处理进程的输入/输出流。


import java.io.IOException;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/*** 类名称: ExeRunUtil.* 类描述: 执行cmd命令*/
public class ExeRunUtil{private static Log log = LogFactory.getLog(ExeRunUtil.class);/** * 执行cmd命令* @return 执行结果*/  public static boolean exec(String[] command) {  Process proc;  try { proc = Runtime.getRuntime().exec(command);   new StreamReader(proc,proc.getInputStream(),"Output" ).start();new StreamReader(proc,proc.getErrorStream(),"Error").start();} catch (IOException ex) {  log.error("IOException while trying to execute " + command,ex);return false;  }  int exitStatus=1;  try {  exitStatus = proc.waitFor();  //等待操作完成 } catch (java.lang.InterruptedException ex) {   log.error("InterruptedException command: " + exitStatus,ex);}   if (exitStatus != 0) {   log.error("Error executing command: " + exitStatus);}  return (exitStatus == 0);  }  
}import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/*** 获取exe执行信息* @author shandongwill**/
public class StreamReader extends Thread{private final Log logger = LogFactory.getLog(getClass());private InputStream is;  private String type;  private Process proc;public StreamReader(Process proc,InputStream is, String type) {  this.is = is;  this.type = type;  this.proc=proc;}  public void run() {  try {  InputStreamReader isr = new InputStreamReader(is);  BufferedReader br = new BufferedReader(isr);  String line = null;  while ((line = br.readLine()) != null) {  if (type.equals("Error")) {  logger.error("Error:" + line);  proc.destroyForcibly();} else {  logger.debug("Debug:" + line);  }  }  } catch (IOException ioe) {  logger.error(ioe);  }  } 
}

使用ProcessBuilder

相比于 Runtime.exec(),ProcessBuilder 提供了更强大和灵活的功能,并允许你更好地控制进程的执行。

ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "test.bat");
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
int exitCode = process.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {System.out.println(line);
}
System.out.println("Exit code: " + exitCode);

使用第三方工具包commons-exec.jar

commons-exec.jar 是 Apache Commons Exec 库的一部分,它提供了一个更强大和灵活的 API 来执行外部进程。与 Java 的标准 Runtime.exec() 和 ProcessBuilder 类相比,Apache Commons Exec 提供了更多的功能和更好的错误处理。
使用 Apache Commons Exec,你可以更容易地管理进程执行,包括设置进程的工作目录、环境变量、输入/输出流重定向、超时处理等。此外,它还提供了更好的错误消息和异常处理,帮助开发者更容易地诊断问题。
要使用 commons-exec.jar,你需要将其添加到你的项目依赖中。如果你使用 Maven,你可以在 pom.xml 文件中添加以下依赖:

<dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-exec</artifactId>  <version>1.3</version> <!-- 使用你需要的版本号 -->  
</dependency>

import java.io.ByteArrayOutputStream;
import java.io.IOException;import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.PumpStreamHandler;/*** CMD工具类* * @author Administrator**/
public class CmdUtils {/*** 执行命令* * @param command:命令* @return String[]数组,String[0]:返回的正常信息;String[1]:返回的警告或错误信息* @throws ExecuteException* @throws IOException*/public static String[] handle(String command) throws ExecuteException, IOException {// 接收正常结果流ByteArrayOutputStream outputStream = new ByteArrayOutputStream();// 接收异常结果流ByteArrayOutputStream errorStream = new ByteArrayOutputStream();CommandLine commandline = CommandLine.parse(command);DefaultExecutor exec = new DefaultExecutor();exec.setExitValues(null);// 设置10分钟超时ExecuteWatchdog watchdog = new ExecuteWatchdog(600 * 1000);exec.setWatchdog(watchdog);PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, errorStream);exec.setStreamHandler(streamHandler);exec.execute(commandline);// 不同操作系统注意编码,否则结果乱码String out = outputStream.toString("UTF-8");String error = errorStream.toString("UTF-8");// 返回信息String[] result = new String[2];result[0] = out;result[1] = error;return result;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【初识爬虫+requests模块】

爬虫又称网络蜘蛛、网络机器人。本质就是程序模拟人使用浏览器访问网站&#xff0c;并将需要的数据抓取下来。爬虫不仅能够使用在搜索引擎领域&#xff0c;在数据分析、商业领域都得到了大规模的应用。 URL 每一个URL指向一个资源&#xff0c;可以是一个html页面&#xff0c;一…

配置git环境与项目创建

项目设计 名称&#xff1a;KOB 项目包含的模块 PK模块&#xff1a;匹配界面&#xff08;微服务&#xff09;、实况直播界面&#xff08;WebSocket协议&#xff09; 对局列表模块&#xff1a;对局列表界面、对局录像界面 排行榜模块&#xff1a;Bot排行榜界面 用户中心模块&…

从Kafka系统中读取消息数据——消费

从Kafka系统中读取消息数据——消费 消费 Kafka 集群中的主题消息检查消费者是不是单线程主题如何自动获取分区和手动分配分区subscribe实现订阅&#xff08;自动获取分区&#xff09;assign&#xff08;手动分配分区&#xff09; 反序列化主题消息反序列化一个类.演示 Kafka 自…

软件测试学习笔记-使用jmeter进行性能测试

性能测试&#xff1a;使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程。 性能测试的目的&#xff1a; 评估当前系统的能力寻找性能瓶颈&#xff0c;优化性能评估软件是否能够满足未来的需要 性能测试和功能测试对比 焦点不同&…

基于FPGA的图像最近邻插值算法verilog实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA数据导入matlab显示图片&#xff0c;效果如下&#xff1a; 2.算法运行软件版本 vivado2019.2&#xff0c;matlab2022a 3.部分核心程序 ti…

【开源】SpringBoot框架开发高校学生管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 学院课程模块2.3 学生选课模块2.4 成绩管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学院课程表3.2.3 学生选课表3.2.4 学生成绩表 四、系统展示五、核心代码5.1 查询课程5.2 新…

开源软件:引领技术创新与商业模式转型

开源软件&#xff1a;引领技术创新与商业模式转型 随着信息技术的飞速发展&#xff0c;开源软件已然成为推动软件行业进步的重要力量。它不仅促进了技术的创新和应用&#xff0c;还催生了多样化的商业模式&#xff0c;深刻影响着全球软件生态系统的演变。 ### 开源软件与技术…

DQN的理论研究回顾

DQN的理论研究回顾 1. DQN简介 强化学习&#xff08;RL&#xff09;&#xff08;Reinforcement learning: An introduction, 2nd, Reinforcement Learning and Optimal Control&#xff09;一直是机器学习的一个重要领域&#xff0c;近几十年来获得了大量关注。RL 关注的是通…

服务器和CDN推荐

简介 陆云Roovps是一家成立于2021年的主机服务商&#xff0c;主要业务是销售美国服务器、香港服务器及国外湖北十堰高防服务器&#xff0c;还有相关CDN产品。&#xff08; 地址&#xff1a;roovps&#xff09; 一、相关产品

C语言之数据在内存中的存储

目录 1. 整数在内存中的存储2. 大小端字节序和字节序判断什么是大小端&#xff1f;为什么有大小端&#xff1f;练习1练习2练习3练习4练习5练习6 3. 浮点数在内存中的存储浮点数存的过程浮点数取得过程练习题解析 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们已经…

ffmpeg的使用,安装,抽帧,加水印,截图,生成gif,格式转换,抓屏等

实际使用中总结的关于ffmpeg对视频的处理的记录文档 具体信息&#xff1a; http://ffmpeg.org/download.html 官网下载ffmpeg 关于ffmpeg的安装详细步骤和说明 装ffmpeg 方式,Linux和windows下的 http://bbs.csdn.net/topics/390519382 php 调用ffmpeg , http://bbs.csdn.net/t…

机器学习之正态分布

正态分布:也称常态分布,又名高斯分布。正态曲线呈钟形,两头低,中间高,左右对称因其曲线呈钟形,也称钟形曲线。若随机变量X服从一个数学期望为μ、方差为 σ 2 \sigma^2 σ2的正态分布,记为N(μ, σ 2 σ^2 σ2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准…

(篇九)MySQL常用内置函数

目录 ⌛数学函数 ⌛字符串函数 ⌛聚合函数 ⌛日期函数 &#x1f4d0;获取当前时间 &#x1f4d0;获取时间的某些内容 &#x1f4d0;​编辑 &#x1f4d0;格式化函数 &#x1f4cf;format类型&#xff1a; ⌛系统信息函数 ⌛类型转换函数 数学函数 字符串函数 聚合函…

SSH口令问题

SSH&#xff08;Secure Shell&#xff09;是目前较可靠、专为远程登录会话和其他网络服务提供 安全性的协议&#xff0c;主要用于给远程登录会话数据进行加密&#xff0c;保证数据传输的安全。 SSH口令长度太短或者复杂度不够&#xff0c;如仅包含数字或仅包含字母等时&#xf…

html5 audio video

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 不可用&#xff1a; 可用&#xff1a; Google Chrome Close AutoUpdate-CSDN博客

[C++] 如何使用Visual Studio 2022 + QT6创建桌面应用

安装Visual Studio 2022和C环境 [Visual Studio] 基础教程 - Window10下如何安装VS 2022社区版_visual studio 2022 社区版-CSDN博客 安装QT6开源版 下载开源版本QT Try Qt | 开发应用程序和嵌入式系统 | Qt Open Source Development | Open Source License | Qt 下载完成&…

请问半吊子 C++选手该如何深入学习 C++?

请问半吊子 C选手该如何深入学习 C? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff0…

React 实现表单组件

表单是html的基础元素&#xff0c;接下来我会用React实现一个表单组件。支持包括输入状态管理&#xff0c;表单验证&#xff0c;错误信息展示&#xff0c;表单提交&#xff0c;动态表单元素等功能。 数据状态 表单元素的输入状态管理&#xff0c;可以基于react state 实现。 …

亚马逊运营新手指南:10个基础概念解析

亚马逊作为全球最大的在线零售平台&#xff0c;为卖家们提供了巨大的商机。然而&#xff0c;跳入这片繁荣的电商海洋之前&#xff0c;了解一些基础概念是成功的关键。以下是每位亚马逊运营新手必须掌握的10个基础概念&#xff0c;帮助你建立起有效的跨境电商策略。 亚马逊10个基…

【证书管理】实验报告

证书管理实验 【实验环境】 ISES客户端 【实验步骤】 查看证书 查看证书详细信息 选择任意证书状态&#xff0c;在下方“证书列表”中出现符合要求的所有证书。在“证书列表”中点击要查看证书&#xff0c;在右侧“证书详细信息”栏出现被选证书信息。 上述操作如图1.2.…