Java執(zhí)行.bat文件的四種高效方法
在 Java 中執(zhí)行 .bat 文件的方式主要有以下幾種:
一、使用 Runtime.getRuntime().exec()
這是最原始的 Java 執(zhí)行外部命令的方式。
Maven 依賴(lài)(無(wú)需額外依賴(lài))
<!-- 標(biāo)準(zhǔn) Java API,無(wú)需引入額外依賴(lài) -->
示例代碼
public class BatExecutor {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("cmd /c start cmd.exe /c your-script.bat");
int exitCode = process.waitFor();
System.out.println("Exit Code: " + exitCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、使用 ProcessBuilder
更現(xiàn)代和推薦的方式,支持設(shè)置環(huán)境變量、工作目錄等。
Maven 依賴(lài)(無(wú)需額外依賴(lài))
<!-- 標(biāo)準(zhǔn) Java API,無(wú)需引入額外依賴(lài) -->
示例代碼
import java.io.IOException;
public class BatWithProcessBuilder {
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "your-script.bat");
pb.redirectErrorStream(true); // 合并標(biāo)準(zhǔn)輸出與錯(cuò)誤輸出
Process process = pb.start();
int exitCode = process.waitFor();
System.out.println("Exit Code: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
三、使用 Apache Commons Exec(第三方庫(kù))
提供了更高級(jí)的 API 來(lái)處理執(zhí)行過(guò)程中的輸入/輸出流、超時(shí)、退出碼驗(yàn)證等。
Maven 依賴(lài)
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-exec</artifactId>
<version>1.3</version>
</dependency>
示例代碼
import org.apache.commons.exec.*;
import java.io.IOException;
public class BatWithApacheExec {
public static void main(String[] args) {
CommandLine cmdLine = new CommandLine("cmd");
cmdLine.addArgument("/c");
cmdLine.addArgument("your-script.bat");
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(0);
PumpStreamHandler streamHandler = new PumpStreamHandler(System.out, System.err);
executor.setStreamHandler(streamHandler);
try {
int exitCode = executor.execute(cmdLine);
System.out.println("Exit Code: " + exitCode);
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、使用 ProcessHandle(Java 9+)
適用于需要獲取子進(jìn)程 PID 或監(jiān)聽(tīng)進(jìn)程狀態(tài)的場(chǎng)景。
Maven 依賴(lài)(無(wú)需額外依賴(lài))
<!-- 標(biāo)準(zhǔn) Java API,無(wú)需引入額外依賴(lài) -->
示例代碼
import java.io.IOException;
public class BatWithProcessHandle {
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "your-script.bat");
Process process = pb.start();
ProcessHandle handle = process.toHandle();
System.out.println("Process PID: " + handle.pid());
boolean finished = handle.onExit().toCompletableFuture().isDone();
if (finished) {
System.out.println("Process exited.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
總結(jié)對(duì)比
| 方法 | 是否需要依賴(lài) | 控制能力 | 推薦程度 |
|---|---|---|---|
| Runtime.exec() | ? 不需要 | 基礎(chǔ) | ??☆☆☆ |
| ProcessBuilder | ? 不需要 | 高 | ????☆ |
| Apache Commons Exec | ? 需要 | 非常高 | ????? |
| ProcessHandle (Java 9+) | ? 不需要 | 特定用途 | ???☆☆ |
你可以根據(jù)項(xiàng)目需求選擇合適的方式。如果需要健壯的流程控制和異常處理,推薦使用 Apache Commons Exec。
到此這篇關(guān)于Java執(zhí)行.bat文件的四種高效方法的文章就介紹到這了,更多相關(guān)Java執(zhí)行.bat文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus?條件查詢(xún)器的實(shí)現(xiàn)
本文主要介紹了MyBatis-Plus?條件查詢(xún)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Java基礎(chǔ)之重載(Overload)與重寫(xiě)(Override)詳解
這篇文章主要介紹了Java基礎(chǔ)之重載(Overload)與重寫(xiě)(Override)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
MyBatis-Plus執(zhí)行SQL分析打印過(guò)程
這篇文章主要介紹了MyBatis-Plus執(zhí)行SQL分析打印過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Spring Security 和Apache Shiro你需要具備哪些條件
這篇文章主要介紹了Spring Security 和Apache Shiro你需要具備哪些條件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
SpringCloud @FeignClient參數(shù)的用法解析
這篇文章主要介紹了SpringCloud @FeignClient參數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java線(xiàn)程隊(duì)列LinkedBlockingQueue的使用
本文主要介紹了Java線(xiàn)程隊(duì)列LinkedBlockingQueue的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Mybatis游標(biāo)查詢(xún)大量數(shù)據(jù)方式
這篇文章主要介紹了Mybatis游標(biāo)查詢(xún)大量數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java基于Swing和netty實(shí)現(xiàn)仿QQ界面聊天小項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了Java如何利用Swing和netty實(shí)現(xiàn)仿QQ界面聊天小項(xiàng)目,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09

