设为首页 收藏本站
查看: 966|回复: 0

[经验分享] Windows 下调用shell不阻塞方法

[复制链接]

尚未签到

发表于 2016-5-24 09:22:49 | 显示全部楼层 |阅读模式
  CmdExecute.java
  


/**
* @(#) CmdExecute.java Created on 2012-7-19
*
* Copyright (c) 2012 Aspire. All Rights Reserved
*/
package com.aspire.sqmp.mobilemanager.service.adb;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* The class <code>CmdExecute</code>
*
* @author wuyanlong
* @version 1.0
*/
public class CmdExecute {
/**
* Execute a command
*
* @param cmd
* @return
* @throws IOException
*/
public static CmdResponse exec(String cmd) throws IOException {
ReadInputStream msgReadding = null;
ReadInputStream errorMsgReadding = null;
CmdResponse respone = new CmdResponse();
Process process = null;
try {
process = Runtime.getRuntime().exec(cmd);
// 获取进程的错误流
errorMsgReadding = new ReadInputStream(process.getErrorStream());
errorMsgReadding.start();
// 获取正常流信息
msgReadding = new ReadInputStream(process.getInputStream());
msgReadding.start();
// respone
respone.setRunSuccess(process.waitFor() == 0);
respone.setMsg(msgReadding.getMsg());
respone.setErrorMsg(errorMsgReadding.getMsg());
} catch (Exception e) {
respone.setRunSuccess(false);
respone.setErrorMsg(e.getMessage());
e.printStackTrace();
} finally {
try {
if (errorMsgReadding != null)
errorMsgReadding.toStop();
if (msgReadding != null)
msgReadding.toStop();
process.destroy();
} catch (Exception e) {
}
}
return respone;
}
/**
* Execute a command
*
* @param process
* @param command
* @return
*/
public static CmdResponse exec(Process process, String command) {
ReadInputStream msgReadding = null;
ReadInputStream errorMsgReadding = null;
CmdResponse respone = new CmdResponse();
if (process == null) {
respone.setRunSuccess(false);
return respone;
}
DataOutputStream dos = null;
try {
dos = new DataOutputStream(process.getOutputStream());
dos.writeBytes(command + "\n");
dos.writeBytes("exit\n");
dos.flush();
// 获取进程的错误流
errorMsgReadding = new ReadInputStream(process.getErrorStream());
errorMsgReadding.start();
// 获取正常流信息
msgReadding = new ReadInputStream(process.getInputStream());
msgReadding.start();
// respone
respone.setRunSuccess(process.waitFor() == 0);
respone.setMsg(msgReadding.getMsg());
respone.setErrorMsg(errorMsgReadding.getMsg());
} catch (Exception e) {
respone.setRunSuccess(false);
respone.setErrorMsg(e.getMessage());
e.printStackTrace();
} finally {
try {
if (dos != null)
dos.close();
if (errorMsgReadding != null)
errorMsgReadding.toStop();
if (msgReadding != null)
msgReadding.toStop();
process.destroy();
} catch (Exception e) {
}
}
return respone;
}
/**
*
* The class <code>ReadErrorInput</code>
*
* @author wuyanlong
* @version 1.0
*/
static class ReadInputStream extends Thread {
/**
* Running
*/
private boolean running = true;
/**
* Buffer of reading string
*/
private StringBuffer readBuffer = new StringBuffer();
/**
* BufferedReader
*/
private BufferedReader readBr;
private boolean isReading = false;
/**
*
* Constructor
*
* @param is
*/
public ReadInputStream(InputStream is) {
if (is != null)
readBr = new BufferedReader(new InputStreamReader(is));
}
/**
* (non-Javadoc)
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
try {
while (running) {
readding();
sleep(250);
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (readBr != null)
try {
readBr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
super.run();
}
/**
* Reading
*
* @throws IOException
*/
private void readding() throws IOException {
synchronized (this) {
if (isReading)
return;
isReading = true;
}
if (readBr == null)
return;
while (readBr.ready()) {
readBuffer.append(readBr.readLine());
readBuffer.append("\n");
}
synchronized (this) {
isReading = false;
}
}
/**
* To stop thread.
*/
public void toStop() {
running = false;
}
/**
*
* @return
*/
public String getMsg() {
try {
readding();
} catch (IOException e) {
e.printStackTrace();
}
return readBuffer.toString();
}
}
/**
*
* The class <code>CmdRespone</code>
*
* Return response from execute a command
*
* @author wuyanlong
* @version 1.0
*/
public static class CmdResponse {
/**
* Succes of Running
*/
private boolean isRunSuccess;
/**
* Message of success or faild
*/
private String msg;
/**
* Error message
*/
private String errorMsg;
/**
* Getter of isRunSuccess cmdexecute进程运行成功
*
* @return the isRunSuccess
*/
public boolean isRunSuccess() {
return isRunSuccess;
}
/**
* Setter of isRunSuccess
*
* @param isRunSuccess
*            the isRunSuccess to set
*/
public void setRunSuccess(boolean isRunSuccess) {
this.isRunSuccess = isRunSuccess;
}
/**
* Getter of msg
*
* @return the msg
*/
public String getMsg() {
return msg;
}
/**
* Setter of msg
*
* @param msg
*            the msg to set
*/
public void setMsg(String msg) {
this.msg = msg;
}
/**
* Getter of errorMsg
*
* @return the errorMsg
*/
public String getErrorMsg() {
return errorMsg;
}
/**
* Setter of errorMsg
*
* @param errorMsg
*            the errorMsg to set
*/
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
}

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-220912-1-1.html 上篇帖子: windows下使用gcc编译boost库 下篇帖子: 深入浅出:Windows Phone8应用开发
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表