java 自定义协议打开本地cmd_java打开本地应用程序(调用cmd)---Runtime用法详解

有时候咱们须要借助java程序打开电脑自带的一些程序,能够直接打开或者借助cmd命令窗口打开一些经常使用的应用程序或者脚本,在cmd窗口执行的命令均可以经过这种方式运行。php

例如:html

packagecn.xm.exam.test;importjava.io.IOException;importorg.junit.Test;public classTestCmd {

@Testpublic void test1() throwsIOException {//直接打开应用程序

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打开计算器

}

@Testpublic void test2() throwsIOException {/******** 能够经过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

importjava.io.IOException;importjava.io.InputStream;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;public final classTest {private static final Logger logger = LoggerFactory.getLogger(Test.class);public static void main(String[] args) throwsNullPointerException {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 booleanexec(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;

}

}

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

packagecom.test;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;public classMyTest {public static voidmain(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= newInputStreamReader(inputStream);

BufferedReader br= newBufferedReader(inputStreamReader);

String line= null;while ((line = br.readLine()) != null) {

System.out.println(line);

}//获取其错误的输出流

InputStream errorStream =pop.getErrorStream();

InputStreamReader errorStreamReader= newInputStreamReader(errorStream);

BufferedReader errorBr= newBufferedReader(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 开关- 正好两个引号字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值