java打開本地應用程序(調用cmd)---Runtime用法詳解


 

  有時候我們需要借助java程序打開電腦自帶的一些程序,可以直接打開或者借助cmd命令窗口打開一些常用的應用程序或者腳本,在cmd窗口執行的命令都可以通過這種方式運行。

 

例如:

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參數:

        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");

 

 

 也可以直接執行一些命令:

Runtime.getRuntime().exec("calc");//打開計算器

 

 

 

補充:上面的方式都是異步運行的方式,也就是在執行命令之后會不等exec執行完就執行下一條語句,為了實現同步結果,或者為了獲取返回的結果,參考:

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;
    }

}

 參考:https://www.cnblogs.com/qlqwjy/p/9846904.html

 

補充:runtime執行的時候也可以獲取其輸出流與錯誤的輸出流,也就是每次在調用runtime的時候比較耗時,其會創建一個Process,並且伴隨着兩個流。(InputStream可以獲取到類似於在cmd運行的時候獲取到的信息,這在用java寫一些腳本的時候非常有用)

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();
        }
    }
}

 

結果:

.
.
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數量

Runtime.getRuntime().availableProcessors()

 

 

 

調用cmd的時候中間的的/c與/k是cm的參數,windows下查看參數說明:/k參數可以執行完窗口停留

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 開關
        - 正好兩個引號字符

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM