Runtime.getRuntime().exec详解
Runtime.getRuntime().exec 用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。功能和windows“运行”类似。
概述
Runtime.getRuntime().exec 用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。功能和windows“运行”类似。
格式:
1 2 |
|
第一行的“.//p.exe”是要执行的程序名,Runtime.getRuntime() 返回当前应用程序的Runtime对象,该对象的 exec() 方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。
第二条语句的目的等待子进程完成再往下执行。
方法API
Runtime.getRuntime().exec共有六个重载方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
注意:Runtime.exec() 不是cmd或shell环境,因此无法直接调用dir等命令,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器(NT:cmd.exe,windows 95/98:command.exe,linux:/bin/sh)
Procss类将持有该程序返回 Java VM 的引用。这个procss类是一个抽象类,具体子类的实现依赖于不同的底层操作系统。
Process 的常用方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
程序阻塞问题
通过 Process实例.getInputStream() 和 Process实例.getErrorStream() 获取的输入流和错误信息流是缓冲池向当前Java程序提供的,而不是直接获取外部程序的标准输出流和标准错误流。
而缓冲池的容量是一定的,因此若外部程序在运行过程中不断向缓冲池输出内容,当缓冲池填满,那么外部程序将暂停运行直到缓冲池有空位可接收外部程序的输出内容为止。(采用xcopy命令复制大量文件时将会出现该问题)
解决办法:当前的Java程序不断读取缓冲池的内容,从而为腾出缓冲池的空间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
注意:外部程序在执行结束后需自动关闭,否则不管是字符流还是字节流均由于既读不到数据,又读不到流结束符,从而出现阻塞Java进程运行的情况。cmd的参数 “/c” 表示当命令执行完成后关闭自身。
实例
在当前目录执行dir命令,并将结果保存到 c:\dir.txt 文本文件中:
前提:假设当前用户的家目录为c:\user\fsjohnhuang
c:\user\fsjohnhuang下的目录结构
1 2 3 |
|
d:\test下的目录结构
1 2 3 |
|
代码片段
1 2 3 4 5 6 7 8 |
|
执行代码后查看c:\dir.txt文件内容如如下:
1 2 3 4 5 6 7 |
|
拓展
1,调用一次exec方法执行多条cmd命令,使用 && 分隔命令,该方法的局限性是只能在cmd里面使用
1 2 3 4 5 |
|
2,执行Runtime.exec()需要注意的陷阱:https://www.cnblogs.com/fpqi/p/9679039.html
参考文章:https://blog.csdn.net/footless_bird/article/details/116274515
更多推荐
所有评论(0)