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

Java程序執(zhí)行Cmd指令所遇問(wèn)題記錄及解決方案

 更新時(shí)間:2020年09月11日 10:45:38   作者:BingoZe  
這篇文章主要介紹了Java程序執(zhí)行Cmd指令所遇問(wèn)題記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

這篇是有關(guān)在編寫(xiě)Java程序執(zhí)行Cmd指令時(shí)所遇到的問(wèn)題記錄,其中有一些是個(gè)人的理解,如有問(wèn)題望不吝賜教,感謝❤

Windows 命令提示符(cmd.exe)是 Windows NT 下的一個(gè)用于運(yùn)行 Windows 控制面板程序或某些 DOS 程序的shell程序

1.執(zhí)行Cmd命令的兩種方式

(1)RunTime.getRunTime().exec(多種重載方式) - 會(huì)得到一個(gè)Process對(duì)象通過(guò)其start()方法開(kāi)啟一個(gè)新進(jìn)程以執(zhí)行輸入的指令。

在這里插入圖片描述

這種方法就不多說(shuō)了,最后這種形式還是用到第二種方式的方法(Java Api文檔中也推薦使用第二種方式去創(chuàng)建一個(gè)Process對(duì)象):

在這里插入圖片描述

* @see ProcessBuilder
* @since 1.3
*/
public Process exec(String[] cmdarray, String[] envp, File dir)
throws IOException {
return new ProcessBuilder(cmdarray)
.environment(envp)
.directory(dir)
.start();
}

(2).new ProcessBuilder().command(指令)

2.獲取執(zhí)行指令后的輸出:

在這里插入圖片描述

在這里就遇到點(diǎn)問(wèn)題,

上面兩種方式執(zhí)行Windows自帶的命令都沒(méi)有什么問(wèn)題(像Ping、Ipconfig)。但是當(dāng)執(zhí)行像“Java -version”這樣的外部命令,其輸出通過(guò)getInputStream()方法是拿不到的。

后來(lái)是通過(guò)參考網(wǎng)上資料,采用將子進(jìn)程的輸出重定向到文件中,再?gòu)奈募凶x取內(nèi)容的方法:

// 外部程序的輸出放到了錯(cuò)誤信息輸出流中,不將錯(cuò)誤信息流輸出到文件話(huà),輸出信息就看不到了😂
      pb.redirectErrorStream(true);
      // 把執(zhí)行結(jié)果輸出
      pb.redirectOutput(file);
      //等待語(yǔ)句執(zhí)行完成,否則可能會(huì)讀不到結(jié)果。
      pb.start().waitFor();
      InputStream in = new FileInputStream(file);
      br = new BufferedReader(new InputStreamReader(in,charsetName));
      String line = null;
      while ((line = br.readLine()) != null) {
        outPutResult.append(line).append("\n");
      }
      br.close();
      br = null;
      // 刪除臨時(shí)文件
      file.delete();

最新解決方法:剛寫(xiě)完這篇博客,就在想Java開(kāi)發(fā)文檔中這句“否則,如果使用ProcessBuilder.redirectErrorStream重定向子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤,則此方法返回的輸入流將接收合并的標(biāo)準(zhǔn)輸出和子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤?!保ㄏ旅鎴D片)怎么就沒(méi)用呢,結(jié)果回頭一看,文檔是Java 8的,我跑的程序用的是Java 7的,把自己整笑了🙃,還在這一通瞎操作。
而至于為什么要將子進(jìn)程標(biāo)準(zhǔn)輸出和子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出合并,可以看下小弟下面的拙見(jiàn)。

對(duì)于非Windows自帶命令,可以這樣寫(xiě)(不再需要借助文件):

public static StringBuilder runOutCmdTest(String command) {
    BufferedReader br = null;
    StringBuilder outPutResult = new StringBuilder();
    try{
    ProcessBuilder pb = new ProcessBuilder().command("cmd.exe", "/c", command);
    // 外部程序的輸出放到了錯(cuò)誤信息輸出流中
    pb.redirectErrorStream(true);
    // 等待語(yǔ)句執(zhí)行完成,否則可能會(huì)讀不到結(jié)果。
    Process process = pb.start();
    process.waitFor();
    InputStream inputStream = process.getInputStream();
    br = new BufferedReader(new InputStreamReader(inputStream, "GBK"));
    String line;
    while ((line = br.readLine()) != null) {
      outPutResult.append(line).append("\n");
    }
    br.close();
    br = null;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return outPutResult;
  }

3.關(guān)于getInputStream ()無(wú)法得到子進(jìn)程輸出的原因

在這里插入圖片描述

此方法獲取的流是子進(jìn)程正常輸出流不包括異常錯(cuò)誤信息流,Process對(duì)象將異常信息放在了ErrorStream中。這里可以試一下,會(huì)發(fā)現(xiàn)執(zhí)行“Java -version”控制臺(tái)輸出的是紅字,也就是異常信息。

在這里插入圖片描述

emmm至于為什么Windows自帶命令的正常輸出會(huì)被視作異常信息,不太清楚,下次再looklook源碼。

而按上面圖片的最后一句,

4.一個(gè)調(diào)用指令例子

private static final String TEMP_FILE_PATH = "D:\\temp.txt";

  /**
   * 運(yùn)行外部程序命令 無(wú)參數(shù)時(shí)調(diào)用
   * @param command 輸入命令
   * @return 輸出內(nèi)容
   */
  public static StringBuilder runOutCmd(String command) {
    // 默認(rèn)字符解析GBK
    return runOutCmd(command, null,"GBK");
  }

  /**
   * 運(yùn)行外部程序命令 帶參數(shù)
   * @param command 輸入命令
   * @param args 輸入?yún)?shù)
   * @return
   */
  public static StringBuilder runOutCmd(String command, List<String> args) {
    // 默認(rèn)字符解析GBK
    return runOutCmd(command, args,"GBK");
  }

  /**
   * 運(yùn)行外部程序命令 - 帶參數(shù)并規(guī)定字符解析格式
   * @param args 輸入?yún)?shù)
   * @param command 輸入命令
   * @param charsetName 輸出字符解析格式
   * @return
   */
  public static StringBuilder runOutCmd(String command, List<String> args, String charsetName) {
    BufferedReader br = null;
    StringBuilder outPutResult = new StringBuilder();
    try {
      // 新建一個(gè)用來(lái)存儲(chǔ)子進(jìn)程輸出結(jié)果結(jié)果的緩存文件
      File file = new File(TEMP_FILE_PATH);
      if (!file.getParentFile().exists()) {
        file.getParentFile().mkdirs();
      }
      if (!file.exists()) {
        file.createNewFile();
      }
      List<String> execCommand = new LinkedList<>();
      if (args != null) {
        execCommand.addAll(args);
      }
      execCommand.add(0,command);
      execCommand.add(0,"/c");
      execCommand.add(0,"cmd.exe");
      ProcessBuilder pb = new ProcessBuilder().command(execCommand).inheritIO();
      // 外部程序的輸出放到了錯(cuò)誤信息輸出流中
      pb.redirectErrorStream(true);
      // 把執(zhí)行結(jié)果輸出
      pb.redirectOutput(file);
      //等待語(yǔ)句執(zhí)行完成,否則可能會(huì)讀不到結(jié)果。
      pb.start().waitFor();
      InputStream in = new FileInputStream(file);
      br = new BufferedReader(new InputStreamReader(in,charsetName));
      String line = null;
      while ((line = br.readLine()) != null) {
        outPutResult.append(line).append("\n");
      }
      br.close();
      br = null;
      // 刪除臨時(shí)文件
      file.delete();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (br != null) {
        try {
          br.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return outPutResult;
  }

最新例子(不用借助文件):

/**
 * 運(yùn)行外部程序命令 - 帶參數(shù)并規(guī)定字符解析格式
 *
 * @param args    輸入?yún)?shù)
 * @param command   輸入命令
 * @param charsetName 輸出字符解析格式
 * @return
 */
public static StringBuilder runOutCmd(String command, List<String> args, String charsetName) {
  BufferedReader br = null;
  StringBuilder outPutResult = new StringBuilder();
  try {
    List<String> execCommand = new LinkedList<>();
    if (args != null) {
      execCommand.addAll(args);
    }
    execCommand.add(0, command);
    execCommand.add(0, "/c");
    execCommand.add(0, "cmd.exe");
    ProcessBuilder pb = new ProcessBuilder().command(execCommand).inheritIO();
    // 外部程序的輸出放到了錯(cuò)誤信息輸出流中
    pb.redirectErrorStream(true);
    //等待語(yǔ)句執(zhí)行完成,否則可能會(huì)讀不到結(jié)果。
    Process process = pb.start();
    process.waitFor();
    InputStream inputStream = process.getInputStream();
    br = new BufferedReader(new InputStreamReader(inputStream, charsetName));
    String line;
    while ((line = br.readLine()) != null) {
      outPutResult.append(line).append("\n");
    }
    br.close();
    br = null;
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    if (br != null) {
      try {
        br.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  return outPutResult;
}

ps:
1. inheritIO()作用:

在這里插入圖片描述

意味著使用此方法,子進(jìn)程的報(bào)錯(cuò)的異常信息也會(huì)在當(dāng)前Java進(jìn)程的控制臺(tái)輸出,而Process對(duì)象將非Windows命令的輸出視為異常信息,那么非Windows命令的輸出當(dāng)使用了此方法的時(shí)候會(huì)在控制臺(tái)輸出。

2.字符解析格式問(wèn)題:
輸出出現(xiàn)亂碼,與Cmd程序字符格式默認(rèn)為GBK有關(guān)。
按實(shí)際情況修改流的解析格式就可以了:

 br = new BufferedReader(new InputStreamReader(in,charsetName));

在這里插入圖片描述

到此這篇關(guān)于Java程序執(zhí)行Cmd指令所遇問(wèn)題記錄及解決方案的文章就介紹到這了,更多相關(guān)Java程序執(zhí)行Cmd指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud解決feign調(diào)用token丟失問(wèn)題解決辦法

    SpringCloud解決feign調(diào)用token丟失問(wèn)題解決辦法

    在feign調(diào)用中可能會(huì)遇到如下問(wèn)題:同步調(diào)用中,token丟失,這種可以通過(guò)創(chuàng)建一個(gè)攔截器,將token做透?jìng)鱽?lái)解決,異步調(diào)用中,token丟失,這種就無(wú)法直接透?jìng)髁?因?yàn)樽泳€(xiàn)程并沒(méi)有token,這種需要先將token從父線(xiàn)程傳遞到子線(xiàn)程,再進(jìn)行透?jìng)?/div> 2024-05-05
  • SpringSecurity動(dòng)態(tài)加載用戶(hù)角色權(quán)限實(shí)現(xiàn)登錄及鑒權(quán)功能

    SpringSecurity動(dòng)態(tài)加載用戶(hù)角色權(quán)限實(shí)現(xiàn)登錄及鑒權(quán)功能

    這篇文章主要介紹了SpringSecurity動(dòng)態(tài)加載用戶(hù)角色權(quán)限實(shí)現(xiàn)登錄及鑒權(quán)功能,很多朋友感覺(jué)這個(gè)功能很難,今天小編通過(guò)實(shí)例代碼給大家講解,需要的朋友可以參考下
    2019-11-11
  • SpringBoot集成RabbitMQ的方法(死信隊(duì)列)

    SpringBoot集成RabbitMQ的方法(死信隊(duì)列)

    這篇文章主要介紹了SpringBoot集成RabbitMQ的方法(死信隊(duì)列),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • springboot項(xiàng)目啟動(dòng)類(lèi)錯(cuò)誤(找不到或無(wú)法加載主類(lèi) com.**Application)

    springboot項(xiàng)目啟動(dòng)類(lèi)錯(cuò)誤(找不到或無(wú)法加載主類(lèi) com.**Application)

    本文主要介紹了spring-boot項(xiàng)目啟動(dòng)類(lèi)錯(cuò)誤(找不到或無(wú)法加載主類(lèi) com.**Application),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • JavaSE中比較器、深拷貝淺拷貝舉例詳解

    JavaSE中比較器、深拷貝淺拷貝舉例詳解

    在Java中一切都可以視為對(duì)象,在Java中我們經(jīng)常使用引用去操作對(duì)象,下面這篇文章主要給大家介紹了關(guān)于JavaSE中比較器、深拷貝淺拷貝的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • SpringBoot多模塊搭建的實(shí)現(xiàn)示例

    SpringBoot多模塊搭建的實(shí)現(xiàn)示例

    多模塊開(kāi)發(fā)是指將一個(gè)大型應(yīng)用程序拆分為多個(gè)模塊,本文主要介紹了SpringBoot多模塊搭建的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • public?static?void?main(String[]?args)使用解讀

    public?static?void?main(String[]?args)使用解讀

    這篇文章主要介紹了public?static?void?main(String[]?args)的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java源碼解析之ConcurrentHashMap

    Java源碼解析之ConcurrentHashMap

    今天帶大家分析Java源碼,文中對(duì)Java ConcurrentHashMap介紹的非常詳細(xì),有代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java實(shí)現(xiàn)文件名倒序排序的技術(shù)指南

    Java實(shí)現(xiàn)文件名倒序排序的技術(shù)指南

    在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要對(duì)文件進(jìn)行操作和處理,一個(gè)常見(jiàn)的需求是按文件名倒序排列文件列表,以便于文件的管理和查找,本文將介紹如何在Java中實(shí)現(xiàn)文件名倒序排序,并提供詳細(xì)的代碼案例,需要的朋友可以參考下
    2024-08-08
  • Java提取2個(gè)集合中的相同和不同元素代碼示例

    Java提取2個(gè)集合中的相同和不同元素代碼示例

    這篇文章主要介紹了Java提取2個(gè)集合中的相同和不同元素代碼示例,涉及對(duì)removeall方法的簡(jiǎn)單介紹,然后分享了主要的示例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11

最新評(píng)論

东明县| 湖州市| 海丰县| 依兰县| 马鞍山市| 蓬溪县| 大安市| 绥中县| 江门市| 将乐县| 昌吉市| 绥化市| 邵武市| 泸溪县| 任丘市| 扎兰屯市| 沿河| 乐陵市| 肥城市| 玉树县| 河南省| 铜鼓县| 巨野县| 元谋县| 和田县| 弋阳县| 尖扎县| 当雄县| 民县| 鄄城县| 湖南省| 巴林左旗| 温宿县| 明光市| 龙井市| 舒城县| 英超| 乐业县| 兴和县| 黔西| 都兰县|