更新時間:2022-07-04 12:10:13 來源:動力節(jié)點(diǎn) 瀏覽7933次
Java調(diào)用shell腳本的方法是什么?動力節(jié)點(diǎn)小編來告訴大家。
在本教程中,我們將說明在Java代碼中執(zhí)行 shell 命令的兩種方式。
第一種是使用Runtime類并調(diào)用它的exec方法。
第二種更可定制的方式是創(chuàng)建和使用ProcessBuilder實例。
在我們要創(chuàng)建一個執(zhí)行我們的 shell 命令的新進(jìn)程之前,我們需要首先確定我們的JVM正在運(yùn)行的操作系統(tǒng)。
這是因為,在Windows上,我們需要將命令作為cmd.exe shell 的參數(shù)運(yùn)行,而在所有其他操作系統(tǒng)上,我們可以發(fā)出標(biāo)準(zhǔn) shell,稱為sh:
boolean isWindows = System.getProperty("os.name")
.toLowerCase().startsWith("windows");
此外 ,我們需要一種方法來掛鉤我們流程的輸入和輸出流。
至少必須消耗輸出- 否則我們的進(jìn)程不會成功返回,而是會掛起。
讓我們實現(xiàn)一個名為StreamGobbler的常用類,它使用InputStream:
private static class StreamGobbler implements Runnable {
private InputStream inputStream;
private Consumer<String> consumer;
public StreamGobbler(InputStream inputStream, Consumer<String> consumer) {
this.inputStream = inputStream;
this.consumer = consumer;
}
@Override
public void run() {
new BufferedReader(new InputStreamReader(inputStream)).lines()
.forEach(consumer);
}
}
注意:這個類實現(xiàn)了Runnable接口,這意味著它可以被任何Executor 執(zhí)行。
對Runtime.exec()的方法調(diào)用是一種簡單的、尚未可定制的方法來生成新的子進(jìn)程。
在以下示例中,我們將請求用戶主目錄的目錄列表并將其打印到控制臺:
String homeDirectory = System.getProperty("user.home");
Process process;
if (isWindows) {
process = Runtime.getRuntime()
.exec(String.format("cmd.exe /c dir %s", homeDirectory));
} else {
process = Runtime.getRuntime()
.exec(String.format("sh -c ls %s", homeDirectory));
}
StreamGobbler streamGobbler =
new StreamGobbler(process.getInputStream(), System.out::println);
Executors.newSingleThreadExecutor().submit(streamGobbler);
int exitCode = process.waitFor();
assert exitCode == 0;
對于計算問題的第二個實現(xiàn),我們將使用ProcessBuilder。這比運(yùn)行時方法更受歡迎,因為我們能夠自定義一些細(xì)節(jié)。
例如,我們能夠:
使用builder.directory()更改我們的 shell 命令正在運(yùn)行的工作目錄
使用builder.environment()將自定義鍵值映射設(shè)置為環(huán)境
將輸入和輸出流重定向到自定義替換
使用builder.inheritIO()將它們都繼承到當(dāng)前JVM進(jìn)程的流中
ProcessBuilder builder = new ProcessBuilder();
if (isWindows) {
builder.command("cmd.exe", "/c", "dir");
} else {
builder.command("sh", "-c", "ls");
}
builder.directory(new File(System.getProperty("user.home")));
Process process = builder.start();
StreamGobbler streamGobbler =
new StreamGobbler(process.getInputStream(), System.out::println);
Executors.newSingleThreadExecutor().submit(streamGobbler);
int exitCode = process.waitFor();
assert exitCode == 0;
通過上述介紹,相信大家對Java調(diào)用shell腳本的方法已經(jīng)有所了解,大家如果想了解更多相關(guān)知識,可以關(guān)注一下動力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容細(xì)致全面,很適合沒有基礎(chǔ)的小伙伴學(xué)習(xí),希望對大家能夠有所幫助。
相關(guān)閱讀

初級 202925

初級 203221

初級 202629

初級 203743