Apache commons exec 简介和简单ping命令方法调用实现

Apache commonsexec提供一些常用的方法用来执行外部进程。Apache commons exec库提供了监视狗Watchdog来设监视进程的执行超时,同时也还实现了同步和异步功能。

Apache commonsexec涉及到多线程,比如新启动一个进程,Java中需要再开三个线程来处理进程的三个数据流,分别是标准输入,标准输出和错误输出。

需要使用该功能需要引入commons-exec-1.3.jar包,目前最新的版本为1.3版本。

在日常工作和生活中,我们经常需要用到网络,网络有时候会出现不稳定的情况,这个时候我们可以用ping命令查看网络情况,如果需要自动化检测网络,那么下面这个例子可以参考。

packagetest.ffm83.commons.exec;

importorg.apache.commons.exec.CommandLine;

importorg.apache.commons.exec.DefaultExecutor;

importorg.apache.commons.exec.PumpStreamHandler;

importorg.apache.commons.io.output.ByteArrayOutputStream;

/**

* 通过commons exec启动ping命令来查看网络情况

* @author 范芳铭

*/

public classEasyExecPing {

public static void main(String[] args){

EasyExecPing exec = newEasyExecPing();

exec.ping("127.0.0.1");

}

public void ping(String ip) {

String command = "ping" + ip;

try {

ByteArrayOutputStreamoutputStream = new ByteArrayOutputStream();

ByteArrayOutputStreamerrorStream = new ByteArrayOutputStream();

//命令行处理

CommandLinecommandline = CommandLine.parse(command);

//进行执行体

DefaultExecutor exec= new DefaultExecutor();

exec.setExitValues(null);

PumpStreamHandlerstreamHandler = new PumpStreamHandler(

outputStream,errorStream);

exec.setStreamHandler(streamHandler);

exec.execute(commandline);//执行

String out =outputStream.toString("gbk");

String error =errorStream.toString("gbk");

System.out.println(out);

System.err.println(error);

} catch (Exception e) {

e.printStackTrace();

}

}

}

运行情况如下:

正在 Ping 127.0.0.1 具有 32 字节的数据:

来自 127.0.0.1 的回复: 字节=32 时间<1msTTL=64

来自 127.0.0.1 的回复: 字节=32 时间<1msTTL=64

来自 127.0.0.1 的回复: 字节=32 时间<1msTTL=64

来自 127.0.0.1 的回复: 字节=32 时间<1msTTL=64

127.0.0.1 的 Ping 统计信息:

数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),

往返行程的估计时间(以毫秒为单位):

最短 = 0ms,最长 = 0ms,平均 = 0ms

结果非常不错。但是ping命令还有其他写法,比如ping 127.0.0.1 –t  ,这个表示一直查看。加到我们的程序中试一下。

我泡了一杯茶,看了下,程序还在执行;

召集了一次项目例会,会开完了,程序还在执行;

看下时间,从开始运行到现在已经过去了3小时。

一不小心就搞出了死循环了,赶紧想办法吧。

开头的地方提到,有监视狗Watchdog可以控制超时,我们试一下吧。

加入监控狗的ping代码:

packagetest.ffm83.commons.exec;

importorg.apache.commons.exec.CommandLine;

importorg.apache.commons.exec.DefaultExecutor;

importorg.apache.commons.exec.ExecuteWatchdog;

importorg.apache.commons.exec.PumpStreamHandler;

importorg.apache.commons.io.output.ByteArrayOutputStream;

/**

* 通过commons exec启动ping命令来查看网络情况

* @author 范芳铭

*/

public classEasyExecPing {

public static void main(String[] args){

EasyExecPing exec = newEasyExecPing();

exec.ping("127.0.0.1-t");

}

public void ping(String ip) {

String command = "ping" + ip;

try {

ByteArrayOutputStreamoutputStream = new ByteArrayOutputStream();

ByteArrayOutputStreamerrorStream = new ByteArrayOutputStream();

//命令行处理

CommandLinecommandline = CommandLine.parse(command);

//进行执行体

DefaultExecutor exec= new DefaultExecutor();

exec.setExitValues(null);

//利用监视狗来设置超时

ExecuteWatchdogwatchdog = new ExecuteWatchdog(60000);

exec.setWatchdog(watchdog);

PumpStreamHandlerstreamHandler = new PumpStreamHandler(

outputStream,errorStream);

exec.setStreamHandler(streamHandler);

exec.execute(commandline);//执行

String out =outputStream.toString("gbk");

String error =errorStream.toString("gbk");

System.out.println(out);

System.err.println(error);

} catch (Exception e) {

e.printStackTrace();

}

}

}

运行结果如下:

正在 Ping 127.0.0.1 具有 32 字节的数据:

来自 127.0.0.1 的回复: 字节=32 时间<1msTTL=64

来自 127.0.0.1 的回复: 字节=32 时间<1msTTL=64

来自 127.0.0.1 的回复: 字节=32 时间<1msTTL=64

来自 127.0.0.1 的回复: 字节=32 时间<1msTTL=64

……

时间: 2024-11-11 12:30:33

Apache commons exec 简介和简单ping命令方法调用实现的相关文章

Apache commons chain简介和简单实现

apache commons chain 提供了对CoR模式的基础支持..CoR模式,是Chain of Responsebility的缩写.CommonsChain实现了Chain of Responsebility和Command模式,其中的Catalog + 配置文件的方式使得调用方和Command的实现方的耦合度大大的降低,提高了灵活性. 使用Apachecommons chain,需要将commons-chain.jar放入你的classpath,目前最新的版本是1.2. 从使用的角度

利用Apache commons exec 实现指定应用打开对应文件

在实际工作中,我们有时候需要指定某一个应用,打开某一个文件.比如用播放器打开一个MP3音乐文件,用记事本打开一个文本文件.不过有的应用需要一些额外的参数,在具体使用的时候要注意. package test.ffm83.commons.exec; import org.apache.commons.exec.CommandLine; importorg.apache.commons.exec.DefaultExecutor; importorg.apache.commons.exec.Execut

Java执行外部程序(Apache Commons Exec)

之前使用Runtime.getRuntime().exec调用外部程序,在Tomcat下会有当前线程一直等待的现象.当时为了解决这个问题,使用新建线程接收外部程序的输出信息,详情请看博客http://blog.csdn.net/accountwcx/article/details/46785437. 后来在网上找到开源的Java调用外部程序类库Apache Commons Exce,这个类库提供非阻塞方法调用外部程序. 官方网址 http://commons.apache.org/proper/

Java运行外部程序(Apache Commons Exec)

之前使用Runtime.getRuntime().exec调用外部程序.在Tomcat下会有当前线程一直等待的现象. 当时为了解决问题,使用新建线程接收外部程序的输出信息.详情请看博客http://blog.csdn.net/accountwcx/article/details/46785437. 后来在网上找到开源的Java调用外部程序类库Apache Commons Exce,这个类库提供非堵塞方法调用外部程序. 官方网址 http://commons.apache.org/proper/c

Apache Commons logging简介和使用

本章节内容主要来自网络和整理. Apache Commons Logging,又叫做JakartaCommons Logging (JCL),他提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具.它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具.用户被假定已熟悉某种日志实现工具的更高级别的细节.JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK等,进行了

Apache commons Proxy简介和动态代理、动态拦截器实现

Apache Commons Proxy 是Apache 的一个之项目,封装了 Java 对象代理的一些常用方法.又叫做 动态代理. 动态代理的作用非常大,在很多底层框架中都会用得到,比如struts,Spring等都用到了动态代理,它的原理很简单,就是将你要使用的类,重新生成一个子类或本类,这样框架就可以利用这个新生成的类做一些事情,比如在该类的方法前后加一些代码. 设想一下,不用修改任何已经编写好的代码,只要使用动态代理就可以灵活的加入一些东西,将来要是不喜欢了,不用也不会影响原来的代码.

Apache在Commons Compress简介和简单应用

Apache在CommonsCompress中提供了众所周知的tar.cpio.zip等压缩算法实现,其中最为丰富的当属zip实现了! Commons Compress为压缩(GZip和BZip2)构建了压缩算法工厂类CompressorStreamFactory.通过这个类可以方便的构建GZip和BZip2的输入输出流,关键字分别为"gz"和"bzip2". GZip Java代码  //GzipCompressorInputStream CompressorIn

Apache Commons CLI 简介

CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理CLI 定义阶段 每一条命令行都必须定义一组参数,它们被用来定义应用程序的接口.Apache Commons CLI 使用 Options 这个类来定义和设置参数,它是所有 Option 实例的容器.在 CLI 中,目前有两种方式来创建 Options,一种是通过构造函数,这是最普通也是最为大家所熟知的一种方式:另外一种方法是通过 Options 中定义的工厂方式

Apache commons CLI介绍和简单应用

CLI 即Command Line Interface,也就是"命令行接口",它为Java 程序访问和解析命令行参数提供了一种统一的接口. apache Commons CLI为用户提供了一个解释命令行的API. 它在解释命令行时主要有三个状态,即:定义.解释和询问交互. 通过使用commons cli则可以很容易的访问参数,而不必去循环String[] args. 这个命令需要模拟命令行输入,可以将应用做成jar文件后输入命令行执行,也可以将命令行包装成参数执行. 在eclipse下