Java執(zhí)行cmd命令的舉例與注意事項(xiàng)
通常 Java 執(zhí)行 Windows 或者 Linux 的命令時(shí),都是使用 Runtime.getRuntime.exec(command) 來(lái)執(zhí)行的
eg1: 執(zhí)行命令
public static void execCommand() { try { Runtime runtime = Runtime.getRuntime(); // 打開(kāi)任務(wù)管理器,exec方法調(diào)用后返回 Process 進(jìn)程對(duì)象 Process process = runtime.exec("cmd.exe /c taskmgr"); // 等待進(jìn)程對(duì)象執(zhí)行完成,并返回“退出值”,0 為正常,其他為異常 int exitValue = process.waitFor(); System.out.println("exitValue: " + exitValue); // 銷(xiāo)毀process對(duì)象 process.destroy(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } }
eg2: 執(zhí)行命令,并獲取正常輸出與錯(cuò)誤輸出
public static void execCommandAndGetOutput() { try { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("cmd.exe /c ipconfig"); // 輸出結(jié)果,必須寫(xiě)在 waitFor 之前 String outStr = getStreamStr(process.getInputStream()); // 錯(cuò)誤結(jié)果,必須寫(xiě)在 waitFor 之前 String errStr = getStreamStr(process.getErrorStream()); int exitValue = process.waitFor(); // 退出值 0 為正常,其他為異常 System.out.println("exitValue: " + exitValue); System.out.println("outStr: " + outStr); System.out.println("errStr: " + errStr); process.destroy(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } public static String getStreamStr(InputStream is) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(is, "GBK")); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); sb.append("\n"); } br.close(); return sb.toString(); }
process對(duì)象可以通過(guò)操作數(shù)據(jù)流,對(duì)執(zhí)行的命令進(jìn)行參數(shù)輸入、獲取命令輸出結(jié)果、獲取錯(cuò)誤結(jié)果
getInputStream() | 獲取process進(jìn)程的輸出數(shù)據(jù) |
---|---|
getOutputStream() | 獲取process進(jìn)程的輸入數(shù)據(jù) |
getErrorStream() | 獲取process進(jìn)程的錯(cuò)誤數(shù)據(jù) |
值得注意的是:
getInputStream() 為什么是獲取輸出數(shù)據(jù)?getOutputStream()為什么是獲取輸入數(shù)據(jù)?這是因?yàn)?input 和 output 是__針對(duì)當(dāng)前調(diào)用 process 的程序而言的__,即
要獲取命令的輸出結(jié)果,就是被執(zhí)行命令的結(jié)果 輸入到我們自己寫(xiě)的程序中,所以用getInputStream()
要往別的程序輸入數(shù)據(jù),就是我們程序要輸出,所以此時(shí)用getOutputStream()
附j(luò)ava調(diào)用cmd命令實(shí)現(xiàn)各種操作
在java編程中,有時(shí)候我們只需要使用自己的程序或者調(diào)用第三方插件就可以完成一些工作,但是因?yàn)閭€(gè)人突發(fā)奇想,雖然cmd命令玩的不是很差,但是是否可以直接將命令寫(xiě)到j(luò)ava程序中,在自己的程序中進(jìn)行對(duì)電腦內(nèi)部的一個(gè)控制呢?舉個(gè)例子可能更方便理解,因?yàn)橥砩弦螺d資源文件,但是我又想睡覺(jué),那么電腦一直開(kāi)著不僅僅對(duì)電腦有損耗,而且可能影響我的睡眠質(zhì)量,雖然我知道cmd的設(shè)置關(guān)機(jī)命令,但是我可以寫(xiě)一個(gè)java可執(zhí)行片段,然后用這個(gè)來(lái)進(jìn)行對(duì)電腦的定時(shí)關(guān)機(jī)操作,這樣以后我如果需要設(shè)置關(guān)機(jī)就可以直接調(diào)用自己的程序了,雖然市面上有專(zhuān)門(mén)的小工具,但是自己寫(xiě)的東西總會(huì)帶來(lái)一點(diǎn)小傲嬌。具體的操作希望大家自行研究,但是要知道cmd命令可以做很多的事情,所以如何合理的在java中使用cmd命令是很有趣的:
public static void main(String[] args) { /*獲取cmd命令*/ try { Process pro = Runtime.getRuntime().exec("cmd /c calc"); //添加要進(jìn)行的命令,"cmd /c calc"中calc代表要執(zhí)行打開(kāi)計(jì)算器,如何設(shè)置關(guān)機(jī)請(qǐng)自己查找cmd命令 BufferedReader br = new BufferedReader(new InputStreamReader(pro .getInputStream())); //雖然cmd命令可以直接輸出,但是通過(guò)IO流技術(shù)可以保證對(duì)數(shù)據(jù)進(jìn)行一個(gè)緩沖。 String msg = null; while ((msg = br.readLine()) != null) { System.out.println(msg); } } catch (IOException exception) { } /*cmd /c dir 是執(zhí)行完dir命令后關(guān)閉命令窗口 cmd /k dir 是執(zhí)行完dir命令后不關(guān)閉命令窗口 cmd /c start dir 會(huì)打開(kāi)一個(gè)新窗口后執(zhí)行dir命令,原窗口會(huì)關(guān)閉 cmd /k start dir 會(huì)打開(kāi)一個(gè)新窗口后執(zhí)行dir命令,原窗口不會(huì)關(guān)閉 cmd /? 查看幫助信息*/ }
在這里要提醒大家的是,cmd命令融合到程序中有時(shí)候往往是有些實(shí)際用途的,比如我的項(xiàng)目中要求一旦用戶做了某種操作就需要關(guān)機(jī),那么這就是一種簡(jiǎn)單的使用。
總結(jié)
到此這篇關(guān)于Java執(zhí)行cmd命令的文章就介紹到這了,更多相關(guān)Java執(zhí)行cmd命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot中的條件裝配bean的實(shí)現(xiàn)
這篇文章主要介紹了spring boot中的條件裝配bean的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12java實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05Java編程常見(jiàn)內(nèi)存溢出異常與代碼示例
這篇文章主要介紹了Java編程常見(jiàn)內(nèi)存溢出異常與代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11java數(shù)據(jù)結(jié)構(gòu)之樹(shù)基本概念解析及代碼示例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)之樹(shù)基本概念解析及代碼示例,介紹了樹(shù)的定義,基本術(shù)語(yǔ),主要操作及實(shí)現(xiàn)等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可了解下。2017-11-11springboot整合shardingsphere和seata實(shí)現(xiàn)分布式事務(wù)的實(shí)踐
本文主要介紹了springboot整合shardingsphere和seata實(shí)現(xiàn)分布式事務(wù)的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)
本文主要介紹了Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03SpringBoot中事務(wù)失效的六個(gè)原因解析
這篇文章主要介紹了SpringBoot中事務(wù)失效的六個(gè)原因解析,由于Spring的事務(wù)是基于AOP的方式結(jié)合動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)的,因此事務(wù)方法一定要是public的,這樣才能便于被Spring做事務(wù)的代理和增強(qiáng),需要的朋友可以參考下2023-10-10