有時候咱們須要藉助java程序打開電腦自帶的一些程序,能夠直接打開或者藉助cmd命令窗口打開一些經常使用的應用程序或者腳本,在cmd窗口執行的命令均可以經過這種方式運行。php
例如:html
package cn.xm.exam.test; import java.io.IOException; import org.junit.Test; public class TestCmd { @Test public void test1() throws IOException { // 直接打開應用程序 Runtime.getRuntime().exec("C:/Users/liqiang/Desktop/開機後點它.bat"); // 打開一個批處理文件 Runtime.getRuntime().exec("E:/酷狗/KGMusic/KuGou.exe"); // 打開酷狗 /******** 能夠經過cmd命令打開軟件或者是作其餘 *****/ Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /k start E:/酷狗/KGMusic/KuGou.exe"); // 經過cmd窗口執行命令 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /k start E:/php/Test/第一個html/界面.html"); // 經過cmd命令打開一個網頁 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /k mkdir C:\\Users\\liqiang\\Desktop\\java鍵的1"); // 經過cmd建立目錄用兩個反斜槓 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /k mkdir C:\\Users\\liqiang\\Desktop\\java鍵的2"); // 經過cmd建立目錄用兩個反斜槓 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /c calc ");// 經過cmd打開計算器 } @Test public void test2() throws IOException { /******** 能夠經過cmd命令打開軟件或者是作其餘 *****/ Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /c osk");// 經過屏幕軟鍵盤 } }
另外也能夠獲取一些其餘的JVM參數:java
long totalMemory = Runtime.getRuntime().totalMemory();//總內存 long freeMemory = Runtime.getRuntime().freeMemory();//剩餘內存 long maxMemory = Runtime.getRuntime().maxMemory();//最大內存 System.out.println(totalMemory/1024/1024+"MB"); System.out.println(freeMemory/1024/1024+"MB"); System.out.println(maxMemory/1024/1024+"MB");
也能夠直接執行一些命令:node
Runtime.getRuntime().exec("calc");//打開計算器
補充:上面的方式都是異步運行的方式,也就是在執行命令以後會不等exec執行完就執行下一條語句,爲了實現同步結果,或者爲了獲取返回的結果,參考:git
import java.io.IOException; import java.io.InputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class Test { private static final Logger logger = LoggerFactory.getLogger(Test.class); public static void main(String[] args) throws NullPointerException { long start = System.currentTimeMillis(); String srcPath = "C:/Users/liqiang/Desktop/ww/tt.docx", desPath = "C:/Users/liqiang/Desktop/ww"; String command = ""; String osName = System.getProperty("os.name"); if (osName.contains("Windows")) { command = "soffice --headless --convert-to pdf " + srcPath + " --outdir " + desPath; exec(command); } long end = System.currentTimeMillis(); logger.debug("用時:{} ms", end - start); } public static boolean exec(String command) { Process process;// Process能夠控制該子進程的執行或獲取該子進程的信息 try { logger.debug("exec cmd : {}", command); process = Runtime.getRuntime().exec(command);// exec()方法指示Java虛擬機建立一個子進程執行指定的可執行程序,並返回與該子進程對應的Process對象實例。 // 下面兩個能夠獲取輸入輸出流 InputStream errorStream = process.getErrorStream(); InputStream inputStream = process.getInputStream(); } catch (IOException e) { logger.error(" exec {} error", command, e); return false; } int exitStatus = 0; try { exitStatus = process.waitFor();// 等待子進程完成再往下執行,返回值是子線程執行完畢的返回值 // 第二種接受返回值的方法 int i = process.exitValue(); // 接收執行完畢的返回值 logger.debug("i----" + i); } catch (InterruptedException e) { logger.error("InterruptedException exec {}", command, e); return false; } if (exitStatus != 0) { logger.error("exec cmd exitStatus {}", exitStatus); } else { logger.debug("exec cmd exitStatus {}", exitStatus); } process.destroy(); // 銷燬子進程 process = null; return true; } }
參考:http://www.javashuo.com/article/p-dpbodgnc-ev.htmlweb
package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class MyTest { public static void main(String[] args) { try { Process pop = Runtime.getRuntime() .exec("E:/weblogic12.1.3/user_projects/domains/base_domain/startWebLogic.cmd"); // 獲取其正常的輸出流 InputStream inputStream = pop.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader br = new BufferedReader(inputStreamReader); String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } // 獲取其錯誤的輸出流 InputStream errorStream = pop.getErrorStream(); InputStreamReader errorStreamReader = new InputStreamReader(errorStream); BufferedReader errorBr = new BufferedReader(errorStreamReader); String errorLine = null; while ((errorLine = errorBr.readLine()) != null) { System.out.println("err:" + errorLine); } pop.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
結果:apache
. . JAVA Memory arguments: -Xms256m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=256m . CLASSPATH=C:\PROGRA~1\Java\JDK17~1.0_8\lib\tools.jar;E:\WEBLOG~1.3\wlserver\server\lib\weblogic_sp.jar;E:\WEBLOG~1.3\wlserver\server\lib\weblogic.jar;E:\WEBLOG~1.3\oracle_common\modules\net.sf.antcontrib_1.1.0.0_1-0b3\lib\ant-contrib.jar;E:\WEBLOG~1.3\wlserver\modules\features\oracle.wls.common.nodemanager_2.0.0.0.jar;E:\WEBLOG~1.3\oracle_common\modules\com.oracle.cie.config-wls-online_8.1.0.0.jar;E:\WEBLOG~1.3\wlserver\common\derby\lib\derbyclient.jar;E:\WEBLOG~1.3\wlserver\common\derby\lib\derby.jar;E:\WEBLOG~1.3\wlserver\server\lib\xqrl.jar;E:\xiangmu\Mytest;C:\PROGRA~1\Java\JDK17~1.0_8\lib;C:\PROGRA~1\Java\JDK17~1.0_8\lib\tools.jar . PATH=;E:\WEBLOG~1.3\wlserver\server\native\win\x64;E:\WEBLOG~1.3\wlserver\server\bin;E:\WEBLOG~1.3\oracle_common\modules\org.apache.ant_1.9.2\bin;C:\PROGRA~1\Java\JDK17~1.0_8\jre\bin;C:\PROGRA~1\Java\JDK17~1.0_8\bin;C:\PROGRA~1\Java\JDK17~1.0_8\jre\bin\server;C:\PROGRA~1\Java\JDK17~1.0_8\jre\bin;C:\PROGRA~1\Java\JDK17~1.0_8\jre\lib\amd64;C:\oraclexe\app\oracle\product\112~1.0\server\bin;C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem;C:\Windows\System32\WINDOW~1\v1.0\;C:\Windows\System32\OpenSSH\;E:\git\Git\cmd;E:\SVN\bin;C:\Users\ADMINI~1\AppData\Local\MICROS~3\WINDOW~1;E:\soft\maven\APACHE~1.9\bin;C:\PROGRA~1\MySQL\MYSQLS~1.7\bin;C:\PROGRA~1\Java\JDK17~1.0_8\bin;E:\git\Git\bin;E:\git\Git\usr\bin;E:\git\Git;C:\PROGRA~1\Java\JDK17~1.0_8\jre\bin;D:\zdcontomcat\zdc8\lo\program;E:\soft\eclipse\ECLIPS~1\eclipse;E:\WEBLOG~1.3\wlserver\server\native\win\x64\oci920_8 . *************************************************** * To start WebLogic Server, use a username and * * password assigned to an admin-level user. For * .......
補充:Runtime也能夠獲取系統的CPU數量windows
Runtime.getRuntime().availableProcessors()
調用cmd的時候中間的的/c與/k是cm的參數,windows下查看參數說明:/k參數能夠執行完窗口停留tomcat
C:\Users\liqiang>cmd/? 啓動 Windows 命令解釋器的一個新實例 CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] [[/S] [/C | /K] string] /C 執行字符串指定的命令而後終止 /K 執行字符串指定的命令但保留 /S 修改 /C 或 /K 以後的字符串處理(見下) /Q 關閉回顯 /D 禁止從註冊表執行 AutoRun 命令(見下) /A 使向管道或文件的內部命令輸出成爲 ANSI /U 使向管道或文件的內部命令輸出成爲 Unicode /T:fg 設置前臺/背景顏色(詳細信息見 COLOR /?) /E:ON 啓用命令擴展(見下) /E:OFF 禁用命令擴展(見下) /F:ON 啓用文件和目錄名完成字符(見下) /F:OFF 禁用文件和目錄名完成字符(見下) /V:ON 使用 ! 做爲分隔符啓用延遲的環境變量 擴展。例如,/V:ON 會容許 !var! 在執行時 擴展變量 var。var 語法會在輸入時 擴展變量,這與在一個 FOR 循環內不一樣。 /V:OFF 禁用延遲的環境擴展。 注意,若是字符串加有引號,能夠接受用命令分隔符 "&&" 分隔多個命令。另外,因爲兼容性 緣由,/X 與 /E:ON 相同,/Y 與 /E:OFF 相同,且 /R 與 /C 相同。任何其餘開關都將被忽略。 若是指定了 /C 或 /K,則會將該開關以後的 命令行的剩餘部分做爲一個命令行處理,其中,會使用下列邏輯 處理引號(")字符: 1. 若是符合下列全部條件,則會保留 命令行上的引號字符: - 不帶 /S 開關 - 正好兩個引號字符