电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:9日期: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
相關文章:
主站蜘蛛池模板: 天津拓展_天津团建_天津趣味运动会_天津活动策划公司-天津华天拓展培训中心 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 空心明胶胶囊|植物胶囊|清真胶囊|浙江绿键胶囊有限公司欢迎您! | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 电机保护器-电动机综合保护器-上海硕吉电器有限公司 | 锂离子电池厂家-山东中信迪生电源| 亚克力制品定制,上海嘉定有机玻璃加工制作生产厂家—官网 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 二手Sciex液质联用仪-岛津气质联用仪-二手安捷伦气质联用仪-上海隐智科学仪器有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 深圳活动策划公司|庆典策划|专业公关活动策划|深圳艺典文化传媒 重庆中专|职高|技校招生-重庆中专招生网 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 天津电机维修|水泵维修-天津晟佳机电设备有限公司 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 自动化改造_智虎机器人_灌装机_贴标机-上海圣起包装机械 | 洗石机-移动滚筒式,振动,螺旋,洗矿机-青州冠诚重工机械有限公司 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 自动气象站_气象站监测设备_全自动气象站设备_雨量监测站-山东风途物联网 | 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 粉丝机械,粉丝烘干机,粉丝生产线-招远市远东粉丝机械有限公司 | 陕西华春网络科技股份有限公司| 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 针焰试验仪,灼热丝试验仪,漏电起痕试验仪,水平垂直燃烧试验仪 - 苏州亚诺天下仪器有限公司 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 棉服定制/厂家/公司_棉袄订做/价格/费用-北京圣达信棉服 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 锌合金压铸-铝合金压铸厂-压铸模具-冷挤压-誉格精密压铸 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 电动打包机_气动打包机_钢带捆扎机_废纸打包机_手动捆扎机 | 蜗轮丝杆升降机-螺旋升降机-丝杠升降机厂家-润驰传动 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 闪电优家-卫生间防水补漏_酒店漏水渗水维修_防水堵漏公司 |