您的位置:首页 > 编程语言 > Java开发

Java执行命令获取结果并超时退出

2015-06-05 17:48 1036 查看
最近做个功能,要用java执行命令,需要获取结果,同时也要求命令执行只能在一个固定的时间内结束,否则就应该超时退出。我想这个功能网上应该一大把吧,没必要自已写,就随便搜了一下,找到一个csdn的,下载还要三分。三分就三分吧,下来一看,居然是再起一个线程去监视执行线程。靠,浪费老子三分。干脆自已看了看api,自已搞。以下是我的实现,有需要的同学可以参考:

/**
* 命令执行
* @param cmd
* @param envs
* @param timeout
* @return
*/
private String execCMD(String cmd, String[] envs, int timeout) {
Process process = null;
StringBuilder sbStd = new StringBuilder();
StringBuilder sbErr = new StringBuilder();

long start = System.currentTimeMillis() / 1000;
try {
if (envs == null) {
process = Runtime.getRuntime().exec(cmd);
} else {
process = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", cmd }, envs);
}

BufferedReader brStd = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader brErr = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = null;

while (true) {
if (brStd.ready()) {
line = brStd.readLine();
sbStd.append(line + "\n");
continue;
}
if (brErr.ready()) {
line = brErr.readLine();
sbErr.append(line + "\n");
continue;
}

if (process != null) {
try {
process.exitValue();
break;
} catch (IllegalThreadStateException e) {
}
}

if (System.currentTimeMillis() / 1000 - start > timeout) {
sbErr.append("\n命令执行超时退出.");
break;
}

try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
}
}
} catch (IOException e) {
} finally {
if (process != null) {
process.destroy();
}
}

if (sbErr.length()>0) {
return sbErr.toString();
} else {
return sbStd.toString();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: