浅析Java执行外部命令的几个要点(3)——如何提取执行命令的标准输出
2008-12-26 13:45
549 查看
转贴请注明出处:http://blog.csdn.com/froole
上一部分定义了一个支持超时控制功能的类——CommandExec
在这部分,将展示CommandExec的使用方法,并且向读者展示如何取得命令的执行结果并将他们打印出来。
环境描述:
假设执行环境为Windows,在C盘(系统盘)上有一个test.zip文件,里面压缩一个test.txt文本文件。
用系统自带的unzip -l命令可以显示出压缩文件的内容。
并且,系统还有sleep命令,用来暂停处理。
执行处理步骤:
生成一个新的CommandExec实现,timeout为6秒
执行系统命令[unzip -l C:/test.zip],确认其正常结束并打印执行结果;
执行[sleep 7],让处理暂停7秒,但是,到了6秒的时候程序会被强制终止,从出口值可以判断[sleep 7]的执行结果是失败的;
执行[unzip -l C:/test.zip],由于Java中将“C:/test.zip”认为“C:test.zip”,由于找不到文件执行将失败,并打印出错误信息。
以下是代码,有兴趣的读者可以在自己的电脑上测试一下。
import java.io.IOException;
import java.io.InputStream;
public class CommandExecTest {
/**
*
* 执行结果:
*
* <pre>
* processSuccess Result:0
* processTimeout Result:1
* processFail Result:9
* >>>>>>>Sucess process:
* ==================
* sucess std:
* Archive: C:/test.zip
* Length Date Time Name
* -------- ---- ---- ----
* 0 08/12/25 20:09 test/test.txt
* -------- -------
* 0 1 file
* ==================
* error std:
* ==================
* >>>>>>>Timeout process:
* ==================
* sucess std:
* ==================
* error std:
* ==================
* >>>>>>>Fail process:
* ==================
* sucess std:
* ==================
* error std:
* unzip: cannot find either C: est.zip or C: est.zip.zip.
* ==================
* </pre>
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Runtime runtime = Runtime.getRuntime();
long timeout = 6 * 1000L;
long invterval = 500L;
CommandExec exec = new CommandExec(runtime, timeout, invterval);
// 执行成功
String[] command = new String[] { "unzip", "-l", "C:/test.zip" };
Process processSuccess = exec.exec(command);
System.out.println("processSuccess Result:" + processSuccess.exitValue());
// 超时执行
command = new String[] { "sleep", "7" };
Process processTimeout = exec.exec(command);
System.out.println("processTimeout Result:" + processTimeout.waitFor());
// 执行失败
command = new String[] { "unzip", "-l", "C:/test.zip" };
Process processFail = exec.exec(command);
System.out.println("processFail Result:" + processFail.waitFor());
// 打印结果
System.out.println(">>>>>>>Sucess process:");
dispProcess(processSuccess);
System.out.println(">>>>>>>Timeout process:");
dispProcess(processTimeout);
System.out.println(">>>>>>>Fail process:");
dispProcess(processFail);
}
/**
*
* 打印输出结果
*
* @param target
* @throws IOException
*/
static void dispProcess(Process target) throws IOException {
InputStream stdIn = target.getInputStream();
InputStream stdErr = target.getErrorStream();
//
try {
System.out.println("==================");
System.out.println("sucess std:");
int c1;
while ((c1 = stdIn.read()) != -1) {
System.out.print((char) c1);
}
System.out.println("==================");
System.out.println("error std:");
int c2;
while ((c2 = stdErr.read()) != -1) {
System.out.print((char) c2);
}
System.out.println("==================");
} finally {
try {
if (stdIn != null) {
stdIn.close();
}
if (stdErr != null) {
stdErr.close();
}
} catch (Exception e) {
}
}
}
}
相关:
-浅析Java执行外部命令的几个要点(1)
-浅析Java执行外部命令的几个要点(2)
-浅析Java执行外部命令的几个要点(3)
-浅析Java执行外部命令的几个要点(4)
<script type="text/javascript"><!--
google_ad_client = "pub-2097865745512830";
/* 728x90, 作成済み 08/12/22 */
google_ad_slot = "5461334436";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
转贴请注明出处:http://blog.csdn.net/froole
上一部分定义了一个支持超时控制功能的类——CommandExec
在这部分,将展示CommandExec的使用方法,并且向读者展示如何取得命令的执行结果并将他们打印出来。
环境描述:
假设执行环境为Windows,在C盘(系统盘)上有一个test.zip文件,里面压缩一个test.txt文本文件。
用系统自带的unzip -l命令可以显示出压缩文件的内容。
并且,系统还有sleep命令,用来暂停处理。
执行处理步骤:
生成一个新的CommandExec实现,timeout为6秒
执行系统命令[unzip -l C:/test.zip],确认其正常结束并打印执行结果;
执行[sleep 7],让处理暂停7秒,但是,到了6秒的时候程序会被强制终止,从出口值可以判断[sleep 7]的执行结果是失败的;
执行[unzip -l C:/test.zip],由于Java中将“C:/test.zip”认为“C:test.zip”,由于找不到文件执行将失败,并打印出错误信息。
以下是代码,有兴趣的读者可以在自己的电脑上测试一下。
import java.io.IOException;
import java.io.InputStream;
public class CommandExecTest {
/**
*
* 执行结果:
*
* <pre>
* processSuccess Result:0
* processTimeout Result:1
* processFail Result:9
* >>>>>>>Sucess process:
* ==================
* sucess std:
* Archive: C:/test.zip
* Length Date Time Name
* -------- ---- ---- ----
* 0 08/12/25 20:09 test/test.txt
* -------- -------
* 0 1 file
* ==================
* error std:
* ==================
* >>>>>>>Timeout process:
* ==================
* sucess std:
* ==================
* error std:
* ==================
* >>>>>>>Fail process:
* ==================
* sucess std:
* ==================
* error std:
* unzip: cannot find either C: est.zip or C: est.zip.zip.
* ==================
* </pre>
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Runtime runtime = Runtime.getRuntime();
long timeout = 6 * 1000L;
long invterval = 500L;
CommandExec exec = new CommandExec(runtime, timeout, invterval);
// 执行成功
String[] command = new String[] { "unzip", "-l", "C:/test.zip" };
Process processSuccess = exec.exec(command);
System.out.println("processSuccess Result:" + processSuccess.exitValue());
// 超时执行
command = new String[] { "sleep", "7" };
Process processTimeout = exec.exec(command);
System.out.println("processTimeout Result:" + processTimeout.waitFor());
// 执行失败
command = new String[] { "unzip", "-l", "C:/test.zip" };
Process processFail = exec.exec(command);
System.out.println("processFail Result:" + processFail.waitFor());
// 打印结果
System.out.println(">>>>>>>Sucess process:");
dispProcess(processSuccess);
System.out.println(">>>>>>>Timeout process:");
dispProcess(processTimeout);
System.out.println(">>>>>>>Fail process:");
dispProcess(processFail);
}
/**
*
* 打印输出结果
*
* @param target
* @throws IOException
*/
static void dispProcess(Process target) throws IOException {
InputStream stdIn = target.getInputStream();
InputStream stdErr = target.getErrorStream();
//
try {
System.out.println("==================");
System.out.println("sucess std:");
int c1;
while ((c1 = stdIn.read()) != -1) {
System.out.print((char) c1);
}
System.out.println("==================");
System.out.println("error std:");
int c2;
while ((c2 = stdErr.read()) != -1) {
System.out.print((char) c2);
}
System.out.println("==================");
} finally {
try {
if (stdIn != null) {
stdIn.close();
}
if (stdErr != null) {
stdErr.close();
}
} catch (Exception e) {
}
}
}
}
相关:
-浅析Java执行外部命令的几个要点(1)
-浅析Java执行外部命令的几个要点(2)
-浅析Java执行外部命令的几个要点(3)
-浅析Java执行外部命令的几个要点(4)
<script type="text/javascript"><!--
google_ad_client = "pub-2097865745512830";
/* 728x90, 作成済み 08/12/22 */
google_ad_slot = "5461334436";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
转贴请注明出处:http://blog.csdn.net/froole
相关文章推荐
- 浅析Java执行外部命令的几个要点(2)——如何支持Timeout
- 浅析Java执行外部命令的几个要点(1)——简单的使用范例以及在Cygwin上的注意点
- 浅析Java执行外部命令的几个要点(4)——支持shell的"|","`","*","?"等特殊符号
- 浅析Java执行外部命令
- CMD命令窗口如何执行带有外部jar包的java文件
- [导入]java中如何执行本地程序并捕获out和err输出
- 如何将整个工程打成jar包,做一个可执行文件(java 命令)
- JAVA命令如何执行带包名的类
- perl中如何执行外部命令
- 用NSTask执行外部命令并获取输出结果的方法
- android中如何执行java命令
- 如何组合几个命令的输出,实现整体的IO重定向
- 如何当使用kill命令结束Java进程时,通知正在执行的Java进程
- java程序执行外部命令
- 在Java中执行脚本命令以及调用外部程序说明
- 穿越之旅之--android中如何执行java命令
- 用java执行外部命令
- 兼容timeout的Java执行外部命令的小程序
- java执行外部命令
- 如何执行本地程序并捕获out和err输出(written in Java)