日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:32日期:2022-08-25 09:21:05

這篇是有關在編寫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指令內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产中文一区| 国产精品久久久久毛片大屁完整版| 亚洲免费中文| 久久婷婷丁香| 美女久久久久久| 91成人精品观看| 久久视频国产| 国产一区日韩欧美| 蜜臀久久精品| 日本免费一区二区三区四区| 久久青青视频| 午夜欧美精品| 在线一区二区三区视频| 羞羞答答国产精品www一本| 久久影视一区| 亚洲天堂黄色| 亚洲女同一区| 青青草精品视频| 国产精品玖玖玖在线资源| 国产精品久久久久久久久久白浆 | 亚洲精品美女91| 日韩天堂av| 99热精品在线观看| 色婷婷狠狠五月综合天色拍| www.51av欧美视频 | 免费视频一区二区三区在线观看 | 国产精品久久久久久久久久10秀| 精品视频在线你懂得| 成人国产综合| 日韩av有码| 久草免费在线视频| 国产亚洲一级| 国产激情久久| 99热精品在线观看| 国产精久久一区二区| 欧美日韩激情| 国产美女亚洲精品7777| 久久青草久久| 国产乱码精品| 亚洲少妇自拍| 精品精品99| 香蕉成人av| 国产欧美一区二区三区国产幕精品| 国产欧洲在线| 免费人成精品欧美精品| 日韩超碰人人爽人人做人人添| 久久久精品国产**网站| 在线一区免费| 久久亚洲人体| 激情自拍一区| 国产精品视频一区二区三区四蜜臂| 国产亚洲一区二区手机在线观看 | 亚洲不卡视频| 国产精品一二| 色婷婷色综合| 久久久成人网| 欧美美女一区| 日本久久综合| 青青在线精品| 福利精品一区| 人人爽香蕉精品| 久久亚洲在线| 亚洲乱码视频| 国产精品美女| 高清日韩中文字幕| 综合在线一区| 国产麻豆久久| 久久久夜夜夜| 97精品国产一区二区三区| 在线一区免费| 国产精品亚洲成在人线| 国产视频一区欧美| 日韩制服丝袜先锋影音| 婷婷综合国产| 亚洲欧洲一区二区天堂久久| 四季av一区二区凹凸精品| 国产精品美女午夜爽爽| 天堂久久av| 中文一区一区三区免费在线观| 亚洲主播在线| 午夜国产精品视频免费体验区| 日本99精品| 99国产精品久久久久久久成人热| 久久黄色影视| 日本在线不卡视频| 99热国内精品| 国产 日韩 欧美 综合 一区| 精品香蕉视频| 国产精品99一区二区三| 青青久久av| 国产乱码精品一区二区亚洲| 最新亚洲一区| 日韩精品诱惑一区?区三区| 在线看片国产福利你懂的| 日本 国产 欧美色综合| 亚洲日本久久| 国产亚洲观看| 日韩在线观看不卡| 四虎4545www国产精品 | 香蕉久久99| 国语对白精品一区二区| 国产农村妇女精品一二区| 国产精品久久观看| 欧美一区成人| 日本不卡一二三区黄网| 亚洲男人在线| 午夜久久久久| 午夜亚洲福利在线老司机| 青青草国产精品亚洲专区无| 日韩精品诱惑一区?区三区| 国产精选久久| 中文字幕高清在线播放| 日韩欧美一区二区三区在线观看 | 国产一区视频在线观看免费| 亚洲精品三级| 老牛国产精品一区的观看方式| 国产一区二区三区自拍| 每日更新成人在线视频| 国产美女久久| 综合五月婷婷| 精品国产一区二区三区2021| 玖玖玖国产精品| 国产传媒在线| 日本免费在线视频不卡一不卡二| 亚洲91视频| 91看片一区| 国产精品激情电影| 欧美一级二区| 亚洲免费婷婷| 久久久五月天| 欧美一级全黄| 国产一区二区三区探花| 久久国产精品免费一区二区三区| 久久国产中文字幕| 亚洲乱码久久| 国产精品色婷婷在线观看| 亚洲男人在线| 欧美日韩99| 日本亚州欧洲精品不卡| 亚洲v天堂v手机在线| 久久午夜精品一区二区| 日日摸夜夜添夜夜添国产精品| 在线亚洲欧美| 欧美激情另类| 尤物精品在线| 亚洲二区视频| 欧美 日韩 国产一区二区在线视频| 999久久久免费精品国产| 国产精品极品国产中出| 国产中文字幕一区二区三区| 国产一区二区三区亚洲| 日韩欧美高清一区二区三区| 三级一区在线视频先锋| 亚洲少妇一区| av亚洲免费| 欧美日韩免费看片| 亚洲精品伊人| 亚洲欧美日本日韩| 五月天久久777| 日韩精品一二区| 蜜臀av在线播放一区二区三区| 亚洲一级大片| 国产精品手机在线播放| 在线一区二区三区视频| 国产精品尤物| 国产成人精品亚洲线观看| 麻豆精品新av中文字幕| 亚洲国内精品| 久久精品97| 日精品一区二区三区| 韩国精品主播一区二区在线观看 | 免费在线观看一区| 欧美亚洲人成在线| 99久久亚洲精品| 久久久国产精品入口麻豆 | 嫩呦国产一区二区三区av| 视频一区视频二区中文字幕| 91亚洲国产高清| 久久人人88| 色在线视频观看| 欧美羞羞视频| 久久精品国产99国产| 亚洲精品伊人| 亚洲欧美网站| 国产韩日影视精品| 国产一区二区亚洲| 亚洲日本网址| 国产成人久久精品一区二区三区| 日韩精品午夜视频| 男人操女人的视频在线观看欧美| 欧美色图一区| 欧美成人高清| 91tv亚洲精品香蕉国产一区| 国产66精品| 超级白嫩亚洲国产第一| 国产精品久久久久久久久久久久久久久 | 日本综合视频| 香蕉视频成人在线观看| 亚洲精品福利| 国精品产品一区|