Java进程Runtime、Process、ProcessBuilder调用外部程序
原文地址:https://blog.csdn.net/c315838651/article/details/72085739
通过Java执行系统命令,与cmd中或者终端上一样执行shell命令,最典型的用法就是使用Runtime.getRuntime().exec(command)或者new ProcessBuilder(cmdArray).start()。让我们看看Runtime、ProcessBuilder的详细解析和详细用法。
Runtime
Runtime类是Java程序的运行时环境。不能new出一个Runtime对象,只能通过getRuntime()方法获取当前Runtime运行时对象的引用。然后可以调用Runtime的方法查看和修改Java虚拟机的状态。
Runtime和ProcessBuilder的不同点就是,启动子进程时的命令形式不同,Runtime.getRuntime.exec()可以把命令和参数写在一个String中,用空格分开,ProcessBuilder则是构造函数的参数中,传递一个由命令和参数组成的list或数组。
Runtime类主要的方法如下,
exec方法接收一个命令然后执行,通过该方法可以执行和cmd中用法一样命令。比如,Runtime.getRuntime().exec(“ls”),就和cmd中执行ls效果一样了。
freeMemory()可以查看当前虚拟机内存中空闲内存还有多少。
totalMemory()可以查看当前虚拟机使用的总内存大小。
maxMemory()可以查看JVM的最终可以使用的最大内存是多少。
availableProcessors()可以查看本机有多少处理器,即本机处理器是多少核。
exit(int)方法可以退出当前Java程序的运行,System.exit(int)方法就是调用了Runtime.exit(int)方法来退出运行的。
示例,
Process
Process是一个抽象类,主要方法如下:
waitFor()是让当前主进程等待这个process指向的子进程执行完成。
exitValue()可以查看process指向的子进程执行完的退出值,0代表是正常运行结束。
destroy()和destroyForcibly()可以终止process子进程的运行,后者是强制终止,前者与平台终止进程的具体实现有关。
通过Runtime.getRuntime().exe(string)可以创建一个本地进程执行传入的命令,这个方法返回Process的一个实例。如,
process指向一个本地进程,相对于main进程来说,process指向的称为子进程。其中的is是为了获取子进程的输出信息。
明明是获取输出信息,为什么是InputStream呢?因为相对于main进程来说,子进程的输出就是main进程的输入,所以是InputStream。vice verse,如果要向子进程传递参数或者输入信息,则应该用OutputStream。但是不推荐用java 1.0引入的Process,而是用java 5.0的ProcessBuilder替代。
ProcessBuilder
ProcessBuilder是java 5.0引入的,start()方法返回Process的一个实例,如,
创建ProcessBuilder不需要通过Runtime,而Runtime.getRimtime().exec(string)正是调用了ProcessBuilder的构造方法来创建子进程并执行的。
ProcessBuilder的构造方法接收一个命令参数的数组形式,其中,第一个元素代表要执行的系统命令,后面的元素代表要传给该命令的参数。
调用.start()方法运行之后,就可以获得该子进程的Process引用了,然后就可以调用Process的方法进行处理。
注意
在用Runtime.getRuntime().exec()或ProcessBuilder(array).start()创建子进程Process之后,一定要及时取走子进程的输出信息和错误信息,否则输出信息流和错误信息流很可能因为信息太多导致被填满,最终导致子进程阻塞住,然后执行不下去。
典型用法应该为,
Java进程Runtime、Process、ProcessBuilder调用外部程序的更多相关文章
- C#使用Process类调用外部程序(转)
在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能.它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程.一.启动进程实例 Process myProc ...
- C# 使用Process调用外部程序中所遇到的参数问题
在使用Process.Start 调用外部程序时,除了程序的地址之外,是可以传递参数的,Process.Start 也有多个重载: // // 摘要: // 启动由包含进程启动信息(例如,要启动的进程 ...
- C#Process调用外部程序
前言 使用C#调用外部程序,一种是通过Process类,一种是通过命令行,本文主要说一下使用C#中的Process类调用外部程序的方式. 过程: 1. 创建Process对象 2. 配置启动选项(输入 ...
- JAVA中调用外部程序,并等待其退出(涉及Runtime和ProcessBuilder)
这段时间要写一个java调用外部程序的功能,踩了几个坑,这里分享一下. 首先用的是RunTime,调用代码如下: Process pro = Runtime.getRuntime().exec(&qu ...
- [Java][Android][Process] ProcessBuilder与Runtime差别
在Android中想要进行Ping,在不Root机器的情况下似乎还仅仅能进行底层命调用才干实现. 由于在Java中要进行ICMP包发送须要Root权限. 于是仅仅能通过创建进程来攻克了.创建进程在Ja ...
- Java魔法堂:调用外部程序
前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不能通 ...
- 多线程 调用多线程的方法 Runtime与ProcessBuilder
一般我们使用Java运行其他类中的方法的时候,无论是静态调用还是动态调用,都是在当前的进程中执行的.也就是只有一个Java虚拟机实例在运行.有时候需要通过Java代码启动多个Java子进程,这样做会消 ...
- java中Runtime类和Process类的简单介绍
在java.lang包当中定义了一个Runtime类,在java中对于Runtime类的定义如下: Java code public class Runtime extends Object 每个 J ...
- PowerShell中调用外部程序和进程操作命令例子
学习PowerShell,我们不指望通过C#编程去搞定所有事情,我们应该记住cmd.exe或者说批处理给我们留下的宝贵财富——通过调用外部程序去解决问题.调用了外部程序,势必就要对进程进行管理,这就是 ...
随机推荐
- css使子元素在父元素居中的各种方法
html结构: <div class="parent"> <div class="child"></div> </di ...
- 修改Mysql数据库的字符集
1.先检查数据库的默认字符集是否是引起不能存储中文的原因: 登录数据库后执行下面的命令 mysql> show variables like 'character%'; 由上图可以看出,data ...
- python selenium 自动化流程的一些总结与思考
首先要考虑的项目为什么要做自动化测试?(主要从自动化测试的优点着手) 其次是什么项目才适合做自动化测试? 自动化测试覆盖率要达到什么样的程度?因为都知道不可能达到100%的,不然脚本太臃肿,反而会失去 ...
- (转)Git 提交的正确姿势:Commit message 编写指南
Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交. $ git commit -m "hello world" 上面代码的-m参数,就是用来 ...
- 【JavaSE】运行时类型信息(RTTI、反射)
运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...
- 7.Jmeter 快速入门教程--录制复杂web测试脚本
Jmeter的功能简单,不需要有脚本语言的编写经验,纯图形界面添加测试场景, 用起来上手很快.但是如果手动添加每一个web(http/https)请求,费时又费力.而且有可能最后手动编写的和实际发的请 ...
- UVA1595_Symmetry
给出平面上n个点,问你能不能找到一个竖线让他们对称 这道题后面发现真的不难,又不止一种方法 我当时写的很挫,死脑筋的就找一个点的对称点存不存在,用结构体存点信息,在排序用find找,,然后不知道一堆w ...
- UVA_548Tree
这是一个很经典的建树,然而当时不会!!!! 给你一个中序和后序 先建一个二叉树,然后找最优解(最优解就是一个叶子节点到根节点权值最小, 同时本身权值最小) //生成一棵树 int build(int ...
- C# winform 文件管理
1.FolderBrowserDialog 打开文件夹中默认路径下的excl文件 private void button7_Click(object sender, EventArgs e) { Fo ...
- 如何在有scoped不影响elementUI 的其他页面组件,进行单页面修改的几种方法。
方式一:内联式css 内联式css , 优点:修改其他方便.缺点:造成页面臃肿,不利于后期维护. 方式二:外链css 外链css ,优点:对其他文件无影响,但会造成多个文件css (缺点) @imp ...