黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) Java調(diào)用shell腳本的方法

Java調(diào)用shell腳本的方法

更新時(shí)間:2022-07-04 12:10:13 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽7542次

Java調(diào)用shell腳本的方法是什么?動(dòng)力節(jié)點(diǎn)小編來(lái)告訴大家。

1.概述

在本教程中,我們將說(shuō)明在Java代碼中執(zhí)行 shell 命令的兩種方式。

第一種是使用Runtime類并調(diào)用它的exec方法。

第二種更可定制的方式是創(chuàng)建和使用ProcessBuilder實(shí)例。

2.操作系統(tǒng)依賴

在我們要?jiǎng)?chuàng)建一個(gè)執(zhí)行我們的 shell 命令的新進(jìn)程之前,我們需要首先確定我們的JVM正在運(yùn)行的操作系統(tǒng)。

這是因?yàn)椋赪indows上,我們需要將命令作為cmd.exe shell 的參數(shù)運(yùn)行,而在所有其他操作系統(tǒng)上,我們可以發(fā)出標(biāo)準(zhǔn) shell,稱為sh:

boolean isWindows = System.getProperty("os.name")
  .toLowerCase().startsWith("windows");

3.輸入輸出

此外 ,我們需要一種方法來(lái)掛鉤我們流程的輸入和輸出流。

至少必須消耗輸出- 否則我們的進(jìn)程不會(huì)成功返回,而是會(huì)掛起。

讓我們實(shí)現(xiàn)一個(gè)名為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);
    }
}

注意:這個(gè)類實(shí)現(xiàn)了Runnable接口,這意味著它可以被任何Executor 執(zhí)行。

4.運(yùn)行時(shí).exec()

對(duì)Runtime.exec()的方法調(diào)用是一種簡(jiǎn)單的、尚未可定制的方法來(lái)生成新的子進(jìn)程。

在以下示例中,我們將請(qǐng)求用戶主目錄的目錄列表并將其打印到控制臺(tái):

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;

5.流程構(gòu)建器

對(duì)于計(jì)算問(wèn)題的第二個(gè)實(shí)現(xiàn),我們將使用ProcessBuilder。這比運(yùn)行時(shí)方法更受歡迎,因?yàn)槲覀兡軌蜃远x一些細(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;

通過(guò)上述介紹,相信大家對(duì)Java調(diào)用shell腳本的方法已經(jīng)有所了解,大家如果想了解更多相關(guān)知識(shí),可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容細(xì)致全面,很適合沒(méi)有基礎(chǔ)的小伙伴學(xué)習(xí),希望對(duì)大家能夠有所幫助。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 九九热视频免费 | 天天综合色网 | 国产午夜精品不卡视频 | 一本一道波多野结衣一区二区 | 爽爽影院色黄网站在线观看 | 美国一区二区三区 | 欧美日韩精品一区二区三区四区 | 天天干天天色天天射 | 亚洲精品影视 | 最近最新的日本免费 | 一级一片一a一片 | 国产中文久久精品 | 国产偷国产偷亚洲高清在线 | 欧美精品三级在线 | 人人干人人草 | 欧美日韩黄色 | 国产三级日本三级在线播放 | 亚洲另类自拍丝袜第1页 | 天天干妹子 | 韩国一区二区三区 | 国产成人精品免费视频大全软件 | 丝袜足控免费网站xx视频 | 欧美高清在线精品一区 | 欧美人与牲动交a欧美精品 欧美人与日本人xx在线视频 | 国产精品亚洲二区 | 日本福利片午夜免费观着 | 亚洲国产欧美在线人网站 | 成人精品第一区二区三区 | 亚洲a站| 日日碰日日操 | xxxx性欧美hd| 日韩在线视精品在亚洲 | 日韩成人影视 | 精品在线免费播放 | 大学生一级毛片全黄毛片黄 | 天堂在线观看视频观看www | 毛片在线看免费版 | 成人黄色激情视频 | 国产成人午夜极速观看 | 韩国在线观看免费观看影院 | 国产成年网站 |