国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java程序執行Cmd指令所遇問題記錄及解決方案

Java程序執行Cmd指令所遇問題記錄及解決方案

2020-09-12 00:40BingoZe Java教程

這篇文章主要介紹了Java程序執行Cmd指令所遇問題記錄,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

這篇是有關在編寫Java程序執行Cmd指令時所遇到的問題記錄,其中有一些是個人的理解,如有問題望不吝賜教,感謝

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

1.執行Cmd命令的兩種方式

(1)RunTime.getRunTime().exec(多種重載方式) - 會得到一個Process對象通過其start()方法開啟一個新進程以執行輸入的指令。

Java程序執行Cmd指令所遇問題記錄及解決方案

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

Java程序執行Cmd指令所遇問題記錄及解決方案

* @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.獲取執行指令后的輸出:

Java程序執行Cmd指令所遇問題記錄及解決方案

在這里就遇到點問題,

上面兩種方式執行Windows自帶的命令都沒有什么問題(像Ping、Ipconfig)。但是當執行像“Java -version”這樣的外部命令,其輸出通過getInputStream()方法是拿不到的。

后來是通過參考網上資料,采用將子進程的輸出重定向到文件中,再從文件中讀取內容的方法:

// 外部程序的輸出放到了錯誤信息輸出流中,不將錯誤信息流輸出到文件話,輸出信息就看不到了
      pb.redirectErrorStream(true);
      // 把執行結果輸出
      pb.redirectOutput(file);
      //等待語句執行完成,否則可能會讀不到結果。
      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;
      // 刪除臨時文件
      file.delete();

最新解決方法:剛寫完這篇博客,就在想Java開發文檔中這句“否則,如果使用ProcessBuilder.redirectErrorStream重定向子進程的標準錯誤,則此方法返回的輸入流將接收合并的標準輸出和子進程的標準錯誤。”(下面圖片)怎么就沒用呢,結果回頭一看,文檔是Java 8的,我跑的程序用的是Java 7的,把自己整笑了,還在這一通瞎操作。
而至于為什么要將子進程標準輸出和子進程的標準錯誤輸出合并,可以看下小弟下面的拙見。

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

public static StringBuilder runOutCmdTest(String command) {
    BufferedReader br = null;
    StringBuilder outPutResult = new StringBuilder();
    try{
    ProcessBuilder pb = new ProcessBuilder().command("cmd.exe", "/c", command);
    // 外部程序的輸出放到了錯誤信息輸出流中
    pb.redirectErrorStream(true);
    // 等待語句執行完成,否則可能會讀不到結果。
    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.關于getInputStream ()無法得到子進程輸出的原因

Java程序執行Cmd指令所遇問題記錄及解決方案

此方法獲取的流是子進程正常輸出流不包括異常錯誤信息流,Process對象將異常信息放在了ErrorStream中。這里可以試一下,會發現執行“Java -version”控制臺輸出的是紅字,也就是異常信息。

Java程序執行Cmd指令所遇問題記錄及解決方案

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

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

4.一個調用指令例子

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

  /**
   * 運行外部程序命令 無參數時調用
   * @param command 輸入命令
   * @return 輸出內容
   */
  public static StringBuilder runOutCmd(String command) {
    // 默認字符解析GBK
    return runOutCmd(command, null,"GBK");
  }

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

  /**
   * 運行外部程序命令 - 帶參數并規定字符解析格式
   * @param args 輸入參數
   * @param command 輸入命令
   * @param charsetName 輸出字符解析格式
   * @return
   */
  public static StringBuilder runOutCmd(String command, List<String> args, String charsetName) {
    BufferedReader br = null;
    StringBuilder outPutResult = new StringBuilder();
    try {
      // 新建一個用來存儲子進程輸出結果結果的緩存文件
      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();
      // 外部程序的輸出放到了錯誤信息輸出流中
      pb.redirectErrorStream(true);
      // 把執行結果輸出
      pb.redirectOutput(file);
      //等待語句執行完成,否則可能會讀不到結果。
      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;
      // 刪除臨時文件
      file.delete();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (br != null) {
        try {
          br.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return outPutResult;
  }

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

/**
 * 運行外部程序命令 - 帶參數并規定字符解析格式
 *
 * @param args    輸入參數
 * @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();
    // 外部程序的輸出放到了錯誤信息輸出流中
    pb.redirectErrorStream(true);
    //等待語句執行完成,否則可能會讀不到結果。
    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()作用:

Java程序執行Cmd指令所遇問題記錄及解決方案

意味著使用此方法,子進程的報錯的異常信息也會在當前Java進程的控制臺輸出,而Process對象將非Windows命令的輸出視為異常信息,那么非Windows命令的輸出當使用了此方法的時候會在控制臺輸出。

2.字符解析格式問題:
輸出出現亂碼,與Cmd程序字符格式默認為GBK有關。
按實際情況修改流的解析格式就可以了:

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

Java程序執行Cmd指令所遇問題記錄及解決方案

到此這篇關于Java程序執行Cmd指令所遇問題記錄及解決方案的文章就介紹到這了,更多相關Java程序執行Cmd指令內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_42882845/article/details/108520470

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日本三级中文在线电影 | 亚洲成av人片一区二区梦乃 | 国产高清自拍视频 | 91精品一区二区 | 中文字幕一区二区三区四区 | 精品自拍视频 | 亚洲欧美在线观看 | 国产人妖一区二区 | 国产精品久久久久国产a级 国产色 | 高清一区二区三区 | 中文字幕一区二区三区四区 | 日韩一区二区三区在线观看 | 一区二区三区 在线 | 一级爱 | 亚洲免费不卡视频 | 欧美成人一区二区 | 午夜成人免费电影 | 中文字幕在线精品 | 性色网站| 日韩免费在线观看视频 | av中文字幕在线 | 久久小视频 | 色av综合| chinese国产一区二区 | 伊人色综合网 | 九色在线观看 | 国产视频三区 | 一级黄色国产片 | 视频一区二区三区中文字幕 | 黑人精品 | 成人午夜性a一级毛片免费看 | 国产51人人成人人人人爽色哟哟 | 性吧在线 | 成人午夜性成交 | а天堂中文最新一区二区三区 | 成人影院www在线观看 | 久久中文字幕在线 | 亚洲精品在线中文字幕 | 青青av | 亚洲国产精品久久 | 福利视频网站 |