• 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~1JavaJDK17~1.0_8lib	ools.jar;E:WEBLOG~1.3wlserverserverlibweblogic_sp.jar;E:WEBLOG~1.3wlserverserverlibweblogic.jar;E:WEBLOG~1.3oracle_commonmodules
    et.sf.antcontrib_1.1.0.0_1-0b3libant-contrib.jar;E:WEBLOG~1.3wlservermodulesfeaturesoracle.wls.common.nodemanager_2.0.0.0.jar;E:WEBLOG~1.3oracle_commonmodulescom.oracle.cie.config-wls-online_8.1.0.0.jar;E:WEBLOG~1.3wlservercommonderbylibderbyclient.jar;E:WEBLOG~1.3wlservercommonderbylibderby.jar;E:WEBLOG~1.3wlserverserverlibxqrl.jar;E:xiangmuMytest;C:PROGRA~1JavaJDK17~1.0_8lib;C:PROGRA~1JavaJDK17~1.0_8lib	ools.jar
    .
    PATH=;E:WEBLOG~1.3wlserverservernativewinx64;E:WEBLOG~1.3wlserverserverin;E:WEBLOG~1.3oracle_commonmodulesorg.apache.ant_1.9.2in;C:PROGRA~1JavaJDK17~1.0_8jrein;C:PROGRA~1JavaJDK17~1.0_8in;C:PROGRA~1JavaJDK17~1.0_8jreinserver;C:PROGRA~1JavaJDK17~1.0_8jrein;C:PROGRA~1JavaJDK17~1.0_8jrelibamd64;C:oraclexeapporacleproduct112~1.0serverin;C:WindowsSystem32;C:Windows;C:WindowsSystem32wbem;C:WindowsSystem32WINDOW~1v1.0;C:WindowsSystem32OpenSSH;E:gitGitcmd;E:SVNin;C:UsersADMINI~1AppDataLocalMICROS~3WINDOW~1;E:softmavenAPACHE~1.9in;C:PROGRA~1MySQLMYSQLS~1.7in;C:PROGRA~1JavaJDK17~1.0_8in;E:gitGitin;E:gitGitusrin;E:gitGit;C:PROGRA~1JavaJDK17~1.0_8jrein;D:zdcontomcatzdc8loprogram;E:softeclipseECLIPS~1eclipse;E:WEBLOG~1.3wlserverservernativewinx64oci920_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:Usersliqiang>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 开关
            - 正好两个引号字符
  • 相关阅读:
    php判断值是否为空
    MyQQ
    java动态定义二维数组问题
    回归CSDN
    字体工具栏
    传说中的服务器
    sql server 2000 出现不能执行查询,因为一些文件丢失或未注册
    chm文件打不开
    Cmd不能运行,窗口闪一下就消失
    isql病毒
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8206192.html
Copyright © 2020-2023  润新知