java打开本地应用程序(调用cmd)

有时候我们需要借助java程序打开电脑自带的一些程序,可以直接打开或者借助cmd命令窗口打开一些常用的应用程序或者脚本,在cmd窗口执行的命令都可以通过这种方式运行。

例如:

1package cn.xm.exam.test; 2 3import java.io.IOException; 4 5import org.junit.Test; 6 7public class TestCmd { 8 @Test 9 public void test1() throws IOException { 10 // 直接打开应用程序 11 Runtime.getRuntime().exec("C:/Users/liqiang/Desktop/开机后点它.bat"); // 打开一个批处理文件 12 Runtime.getRuntime().exec("E:/酷狗/KGMusic/KuGou.exe"); // 打开酷狗 13 14 /******** 可以通过cmd命令打开软件或者是做其他 *****/ 15 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /k start E:/酷狗/KGMusic/KuGou.exe"); // 通过cmd窗口执行命令 16 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /k start E:/php/Test/第一个html/界面.html"); // 通过cmd命令打开一个网页 17 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /k mkdir C:\\Users\\liqiang\\Desktop\\java键的1"); // 通过cmd创建目录用两个反斜杠 18 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /k mkdir C:\\Users\\liqiang\\Desktop\\java键的2"); // 通过cmd创建目录用两个反斜杠 19 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /c calc ");// 通过cmd打开计算器 20 } 21 22 @Test 23 public void test2() throws IOException { 24 /******** 可以通过cmd命令打开软件或者是做其他 *****/ 25 Runtime.getRuntime().exec("C:/Windows/System32/cmd.exe /c osk");// 通过屏幕软键盘 26 } 27 28}

 另外也可以获取一些其他的JVM参数:

1long totalMemory = Runtime.getRuntime().totalMemory();//总内存 2 long freeMemory = Runtime.getRuntime().freeMemory();//剩余内存 3 long maxMemory = Runtime.getRuntime().maxMemory();//最大内存 4 System.out.println(totalMemory/1024/1024+"MB"); 5 System.out.println(freeMemory/1024/1024+"MB"); 6 System.out.println(maxMemory/1024/1024+"MB");

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

Runtime.getRuntime().exec("calc");//打开计算器

补充:上面的方式都是异步运行的方式,也就是在执行命令之后会不等exec执行完就执行下一条语句,为了实现同步结果,或者为了获取返回的结果,参考:

1import java.io.IOException; 2import java.io.InputStream; 3 4import org.slf4j.Logger; 5import org.slf4j.LoggerFactory; 6 7public final class Test { 8 private static final Logger logger = LoggerFactory.getLogger(Test.class); 9 10 public static void main(String[] args) throws NullPointerException { 11 long start = System.currentTimeMillis(); 12 String srcPath = "C:/Users/liqiang/Desktop/ww/tt.docx", desPath = "C:/Users/liqiang/Desktop/ww"; 13 String command = ""; 14 String osName = System.getProperty("os.name"); 15 if (osName.contains("Windows")) { 16 command = "soffice --headless --convert-to pdf " + srcPath + " --outdir " + desPath; 17 exec(command); 18 } 19 long end = System.currentTimeMillis(); 20 logger.debug("用时:{} ms", end - start); 21 } 22 23 public static boolean exec(String command) { 24 Process process;// Process可以控制该子进程的执行或获取该子进程的信息 25 try { 26 logger.debug("exec cmd : {}", command); 27 process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。 28 // 下面两个可以获取输入输出流 29 InputStream errorStream = process.getErrorStream(); 30 InputStream inputStream = process.getInputStream(); 31 } catch (IOException e) { 32 logger.error(" exec {} error", command, e); 33 return false; 34 } 35 36 int exitStatus = 0; 37 try { 38 exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值 39 // 第二种接受返回值的方法 40 int i = process.exitValue(); // 接收执行完毕的返回值 41 logger.debug("i----" + i); 42 } catch (InterruptedException e) { 43 logger.error("InterruptedException exec {}", command, e); 44 return false; 45 } 46 47 if (exitStatus != 0) { 48 logger.error("exec cmd exitStatus {}", exitStatus); 49 } else { 50 logger.debug("exec cmd exitStatus {}", exitStatus); 51 } 52 53 process.destroy(); // 销毁子进程 54 process = null; 55 56 return true; 57 } 58 59}

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

补充:runtime执行的时候也可以获取其输出流与错误的输出流,也就是每次在调用runtime的时候比较耗时,其会创建一个Process,并且伴随着两个流。(InputStream可以获取到类似于在cmd运行的时候获取到的信息,这在用java写一些脚本的时候非常有用)

1package com.test; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStream; 6import java.io.InputStreamReader; 7 8public class MyTest { 9 public static void main(String[] args) { 10 try { 11 Process pop = Runtime.getRuntime() 12 .exec("E:/weblogic12.1.3/user_projects/domains/base_domain/startWebLogic.cmd"); 13 // 获取其正常的输出流 14 InputStream inputStream = pop.getInputStream(); 15 InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 16 BufferedReader br = new BufferedReader(inputStreamReader); 17 String line = null; 18 while ((line = br.readLine()) != null) { 19 System.out.println(line); 20 } 21 22 // 获取其错误的输出流 23 InputStream errorStream = pop.getErrorStream(); 24 InputStreamReader errorStreamReader = new InputStreamReader(errorStream); 25 BufferedReader errorBr = new BufferedReader(errorStreamReader); 26 String errorLine = null; 27 while ((errorLine = errorBr.readLine()) != null) { 28 System.out.println("err:" + errorLine); 29 } 30 31 pop.waitFor(); 32 } catch (IOException | InterruptedException e) { 33 e.printStackTrace(); 34 } 35 } 36}

结果:

1. 2. 3JAVA Memory arguments: -Xms256m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=128m -XX:MaxPermSize=256m 4. 5CLASSPATH=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 6. 7PATH=;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 8. 9*************************************************** 10* To start WebLogic Server, use a username and * 11* password assigned to an admin-level user. For * 12.......

补充:Runtime也可以获取系统的CPU数量

Runtime.getRuntime().availableProcessors()

调用cmd的时候中间的的/c与/k是cm的参数,windows下查看参数说明:/k参数可以执行完窗口停留

1C:\Users\liqiang>cmd/? 2启动 Windows 命令解释器的一个新实例 3 4CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] 5 [[/S] [/C | /K] string] 6 7/C 执行字符串指定的命令然后终止 8/K 执行字符串指定的命令但保留 9/S 修改 /C/K 之后的字符串处理(见下) 10/Q 关闭回显 11/D 禁止从注册表执行 AutoRun 命令(见下) 12/A 使向管道或文件的内部命令输出成为 ANSI 13/U 使向管道或文件的内部命令输出成为 14 Unicode 15/T:fg 设置前台/背景颜色(详细信息见 COLOR /?) 16/E:ON 启用命令扩展(见下) 17/E:OFF 禁用命令扩展(见下) 18/F:ON 启用文件和目录名完成字符(见下) 19/F:OFF 禁用文件和目录名完成字符(见下) 20/V:ON 使用 ! 作为分隔符启用延迟的环境变量 21 扩展。例如,/V:ON 会允许 !var! 在执行时 22 扩展变量 varvar 语法会在输入时 23 扩展变量,这与在一个 FOR 24 循环内不同。 25/V:OFF 禁用延迟的环境扩展。 26 27注意,如果字符串加有引号,可以接受用命令分隔符 "&&" 28分隔多个命令。另外,由于兼容性 29原因,/X/E:ON 相同,/Y/E:OFF 相同,且 /R30/C 相同。任何其他开关都将被忽略。 31 32如果指定了 /C/K,则会将该开关之后的 33命令行的剩余部分作为一个命令行处理,其中,会使用下列逻辑 34处理引号(")字符: 35 36 1. 如果符合下列所有条件,则会保留 37 命令行上的引号字符: 38 39 - 不带 /S 开关 40 - 正好两个引号字符
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )