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

例如:

  1. package cn.xm.exam.test;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.junit.Test;
  6.  
  7. public 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参数:

  1. long 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");

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

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

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

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3.  
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6.  
  7. public 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写一些脚本的时候非常有用)

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

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

  1. Runtime.getRuntime().availableProcessors()

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

  1. C:\Users\liqiang>cmd/?
  2. 启动 Windows 命令解释器的一个新实例
  3.  
  4. CMD [/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 相同,且 /R
  30. /C 相同。任何其他开关都将被忽略。
  31.  
  32. 如果指定了 /C /K,则会将该开关之后的
  33. 命令行的剩余部分作为一个命令行处理,其中,会使用下列逻辑
  34. 处理引号(")字符:
  35.  
  36. 1. 如果符合下列所有条件,则会保留
  37. 命令行上的引号字符:
  38.  
  39. - 不带 /S 开关
  40. - 正好两个引号字符

java打开本地应用程序(调用cmd)---Runtime用法详解的更多相关文章

  1. 《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)

    1.简介 在实际工作中,我们需要对处理的元素进行高亮显示,或者有时候为了看清楚做跟踪鼠标点击了哪些元素需要标记出来.今天宏哥就在这里把这种测试场景讲解和分享一下. 2.用法 创建一个执行 JS 的对象 ...

  2. 《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)

    1.简介 在做web自动化时,有些情况selenium的api无法完成,需要通过第三方手段比如js来完成实现,比如去改变某些元素对象的属性或者进行一些特殊的操作,本文将来讲解怎样来调用JavaScri ...

  3. 使用JAVA打开本地应用程序相关的文件

    在该项目中需要运行本地文件或应用程序,JDK6添加后Desktop类别.可以直接使用.这使得有可能在程序中无论什么应用程序可以打开的.例:打开pdf文件,当地福昕是默认打开.执行程序将使用福昕开放pd ...

  4. java中的值传递和引用传递用法详解

    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对 ...

  5. c# 程序调用cmd执行命令如SVN.exe

    c# 程序调用cmd执行命令如SVN.exe string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Di ...

  6. C#程序调用CMD执行命令,将参数传递给cmd.exe

    proc.StartInfo.Arguments = "/c ping 10.2.2.125"; C#程序调用CMD执行命令 将参数传递给cmd.exe的(Passing an a ...

  7. Java程序在内存中运行详解

    目录 Java程序在内存中运行详解 一.JVM的内存分布 二.程序执行的过程 三.只有一个对象时的内存图 四.两个对象使用同一个方法的内存图 五.两个引用指向同一个对象的内存图 六.使用对象类型作为方 ...

  8. java程序运行时内存分配详解

    java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下   一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...

  9. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

随机推荐

  1. AJPFX浅谈Java新手问题之缺少良好的编程习惯

    ★随意地命名 有些新手写程序,当需要定义某个变量名(也可能是函数名.类名.包名等)时,随意地一敲键盘,名字就起好了......若干星期后,碰到某 bug,再来看自己写的代码时,心中暗自嘀咕:“这代码是 ...

  2. struct和union

    struct的小秘密 C语言中的struct可以看做变量的集合,struct的问题: 空结构体占用多大内存? 例子1:空结构体的大小 #include<stdio.h> struct ST ...

  3. 分布式技术EJB3_分库架构 - 【动力节点官网】北京Java …

    分布式技术EJB3_分库架构 - [动力节点官网]北京Java … http://www.bjpowernode.com/xiazai/2220.html <程序天下--EJB JPA数据库持久 ...

  4. codevs 1519 过路费

    时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master 题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,…,n.这个国家的政府 ...

  5. 洛谷 P2319 [HNOI2006]超级英雄

    题目描述 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一 ...

  6. 洛谷 P2580 于是他错误的点名开始了

    题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...

  7. 开发笔记 - 解决font-awesome等图标在浏览器中的兼容问题

    今天在写前端页面的时候,觉得font-awesome简单实用就上手试了一下,因为font-awesome图标库甚为强大,我就在其css上多做了一些尝试,这一尝试发现了一个致命的问题,当我对i标签进行统 ...

  8. js join()和split()方法、reverse() 方法、sort()方法

    ############  join()和split()方法  join() 方法用于把数组中的所有元素放入一个字符串. 元素是通过指定的分隔符进行分隔的. 指定分隔符方法join("#&q ...

  9. ES6(vue)对象词法扩展

    ES6 允许声明在对象字面量时使用简写语法,来初始化属性变量和函数的定义方法,并且允许在对象属性中进行计算操作: function getCar(make, model, value) { retur ...

  10. 【2019.5.19】接口测试及python基础(一)

      一.接口 1.什么是接口: 简单的说,接口就是从数据库获取数据. 2.前端和后端: 2.1前端client: 对于web来说,打开的网页,我们所看到的就是前端,前端语言包括html.JS.CSS: ...