最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java代碼執(zhí)行shell命令的實現(xiàn)

 更新時間:2019年09月27日 10:36:58   作者:neweastsun  
這篇文章主要介紹了Java代碼執(zhí)行shell命令的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

本文描述兩種方式使用java代碼執(zhí)行shell命令,首先使用Runtime類調用exce方法,其次使用ProcessBuilder實例實現(xiàn)更靈活的方式。

1. 環(huán)境準備

執(zhí)行shell命令之前,我們需要獲取jvm底層操作系統(tǒng),同時定義通用消費流的類。

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

在創(chuàng)建進場執(zhí)行shell命令之前,我們需要獲取jvm運行在具體哪個操作系統(tǒng)之上。因為Windows執(zhí)行shell命令是cmd.exe,而其他操作系統(tǒng)發(fā)布標準shell是sh:

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

1.2. 輸入和輸出

此外我們還需要一種方法來連接進程的輸入、輸出流。直到輸出流被消費進程才會返回成功,否則會掛起。下面實現(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í)行。

2. Runtime.exec()執(zhí)行

Runtime.exec()方法是一種生成新子進程的簡單方法,但不能定制。下面示例列出用戶目錄的目錄清單并打印至控制臺:

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;

3. ProcessBuilder執(zhí)行

第二種方法使用ProcessBuilder。這比Runtime方法更可取,因為能夠定制一些細節(jié)。

例如:

  • 改變正在運行Shell命令的工作目錄,使用builder.directory()方法
  • 使用builder.environment()方法,設置自定義鍵值對作為環(huán)境變量
  • 重定向輸入和輸出流值自定義流
  • 使用build.inheritio()方法將它們都繼承到當前JVM進程的流中
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;

4. 總結

本文介紹了兩種不同方法執(zhí)行Shell命令。通常如果需要自定義派生流程的執(zhí)行,例如更改其工作目錄,則應考慮使用ProcessBuilder。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring Boot啟動banner定制的步驟詳解

    Spring Boot啟動banner定制的步驟詳解

    這篇文章主要給大家介紹了關于Spring Boot啟動banner定制的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • Java foreach循環(huán)是否可以修改數(shù)據(jù)的值問題解決方法

    Java foreach循環(huán)是否可以修改數(shù)據(jù)的值問題解決方法

    最近在做項目的時候,需要修改一個數(shù)組里面各個元素的值,foreach循環(huán)迭代數(shù)組元素時,不能改變數(shù)組元素的值,這篇文章給大家介紹Java foreach循環(huán)是否可以修改數(shù)據(jù)的值的問題及解決方法,感興趣的朋友一起看看吧
    2024-02-02
  • 利用spring-data-redis實現(xiàn)incr自增的操作

    利用spring-data-redis實現(xiàn)incr自增的操作

    這篇文章主要介紹了利用spring-data-redis實現(xiàn)incr自增的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 淺談Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn)

    淺談Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn)

    這篇文章主要介紹了Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Mybatis使用@Select注解sql中使用in問題

    Mybatis使用@Select注解sql中使用in問題

    這篇文章主要介紹了Mybatis使用@Select注解sql中使用in問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java并發(fā)編程示例(二):獲取和設置線程信息

    Java并發(fā)編程示例(二):獲取和設置線程信息

    這篇文章主要介紹了Java并發(fā)編程示例(二):獲取和設置線程信息,本文是系列文章的第二篇,本文著重講解Thread類的幾個重要屬性,需要的朋友可以參考下
    2014-12-12
  • java??常見位邏輯運算符梳理

    java??常見位邏輯運算符梳理

    這篇文章主要介紹了java常見位邏輯運算符梳理,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參一下下面文章詳細內容
    2022-08-08
  • 實現(xiàn)java文章點擊量記錄實例

    實現(xiàn)java文章點擊量記錄實例

    這篇文章主要為大家介紹了實現(xiàn)java文章點擊量記錄實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • knife4j?整合?springboot的過程詳解

    knife4j?整合?springboot的過程詳解

    這篇文章主要介紹了knife4j整合springboot的過程,本次整合springboot版本為2.3.12,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • JAVA 筆記 ClassLoader.getResourceAsStream() 與 Class.getResourceAsStream()的區(qū)別

    JAVA 筆記 ClassLoader.getResourceAsStream() 與 Class.getResourc

    這篇文章主要介紹了JAVA 筆記 ClassLoader.getResourceAsStream() 與 Class.getResourceAsStream()的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07

最新評論

报价| 四子王旗| 乐都县| 吴江市| 灌云县| 务川| 武义县| 施甸县| 维西| 阿尔山市| 香港| 府谷县| 普兰店市| 乌鲁木齐县| 婺源县| 平原县| 吴忠市| 怀柔区| 水富县| 阿图什市| 墨脱县| 宕昌县| 嘉禾县| 铁力市| 怀来县| 宜黄县| 温泉县| 衡南县| 明溪县| 筠连县| 丹阳市| 宜川县| 永嘉县| 张掖市| 齐河县| 江孜县| 嘉荫县| 鹿泉市| 禹城市| 淮阳县| 修文县|