`
ouyangfeng521
  • 浏览: 251031 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Windows 下调用shell不阻塞方法

 
阅读更多

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;
        }

    }

}
 
分享到:
评论

相关推荐

    linux下组播遇到的问题及解决办法3.docx

    确保在非阻塞模式下调用 `connect()` 之后立即检查连接状态。 #### 问题二:NFS 文件无法写入的权限问题 **问题描述**:使用 NFS 挂载远程文件系统时,无法写入文件。 **解决方案**: 1. **检查权限设置**:确认 ...

    欧唯特Java面试题,供面试参考

    免责声明:本资源仅供学习和研究使用,请勿用于任何商业用途。使用本资源所产生的任何后果,作者不承担任何责任。

    25年背题docx.docx

    25年背题docx.docx

    YOLO系列目标检测算法最新进展及资源汇总

    内容概要:本文主要介绍了截至2023年YOLO系列目标检测算法的最新发展情况,以及一系列的学习资源,涵盖不同版本YOLO的官方资源、重要论文、实践指南、工具框架等各个方面。首先,列举了YOLOv8, v7, v5及其特点与官方GitHub链接;随后,提到了各版YOLO背后的科学依据,即对应的研究论文,特别是v8尚无官方论文的情况下推荐查阅其他官方资料;最后,分享了一些在线教程视频、博客文章、公开数据集(如COCO和PascalVOC)、模型优化方法(TensorRT加速),并且指出了活跃的社区交流平台和持续关注的最佳方式。 适用人群:适用于对深度学习、尤其是计算机视觉中目标检测技术感兴趣的技术从业者及科研人员。 使用场景及目标:为想要深入研究或者应用YOLO算法解决实际问题的研究人员提供参考资料和支持;同时也能为开发者们提供实施项目的指导思路和技术解决方案。 其他说明:文章强调了不断跟进开源社区和技术前沿的重要性,确保能第一时间利用最新的研究成果来提升自身项目效果。

    人工智能大模型体验报告2.0.pdf

    人工智能大模型体验报告2.0.pdf

    SQLiteMigrationManager.swift-Swift资源

    https://github.com/garriguv/SQLiteMigrationManager.swift

    Web开发实训:基于Flask的校园博客系统开发全流程解析

    内容概要:本文档详细介绍了如何使用Python Flask框架开发一个校园博客系统的全过程。内容涵盖从技术选型、系统架构设计到核心功能实现的具体步骤,包括用户认证、文章发布和分类浏览等功能模块的设计。文档不仅提供了理论介绍,还给出了具体的代码示例,并通过截图展示了实际运行效果。同时,文中深入探讨了各个技术点的选择原因及其优缺点,帮助读者理解和掌握Web开发的基本技能和技术选型方法。此外,文档特别关注实用性和可操作性,力求使每个步骤都简单明了,方便初次接触Web开发的大学生学习和实践。 适合人群:主要面向正在学习Web开发并希望通过实例加深理解的大学生和技术爱好者。 使用场景及目标:本指南可用于课程作业、个人项目开发或自我学习,帮助学生理解Web开发的技术细节,掌握实际动手能力。 其他说明:除了技术层面的内容外,文中还包含了关于系统测试、性能优化和安全性的讨论,并附带扩展建议,如缓存机制和全文搜索引擎的引入,增加了学习资料的广度和深度。

    第十五届蓝桥杯单片机省赛真题解析

    第十五届蓝桥杯单片机省赛真题解析

    基于SpringBoot的东北特产销售系统(源码+数据库+万字文档)

    534东北特产销售系统,系统包含三种角色:管理员、用户,农户主要功能如下。 【用户功能】 1. **首页:** 浏览东北特产销售系统的主要信息。 2. **公告:** 查看系统发布的重要通知和公告。 3. **新闻信息:** 阅读有关东北特产的最新新闻和信息。 4. **农户:** 浏览和搜索各个农户提供的特产信息。 5. **商品:** 浏览系统中各类特产商品。 6. **个人中心:** 管理个人信息,查看购物车中的商品。 7. **购物车:** 查看已选购的商品,进行结算和下单。 【管理员功能】 1. **首页:** 查看销售系统整体概况。 2. **个人中心:** 修改密码、管理个人信息。 3. **管理员管理:** 审核和管理注册管理员用户的信息。 4. **基础数据管理:** 管理系统的基础数据,包括公告类型、会员等级类型、新闻类型、商品类型和帮扶申请类型等。 5. **公告管理:** 发布、编辑和删除系统的通知和公告。 6. **新闻信息管理:** 发布、编辑和删除关于东北特产的新闻信息。 7. **商品管理:** 管理特产商品的信息,包括商品基本信息、评价、收藏、订

    (源码)基于C++的BeagleBone BeatBox.zip

    # 基于C++的BeagleBone BeatBox ## 项目简介 本项目是一个使用C++编写的BeagleBone Green应用程序,能够模拟标准鼓节奏的播放。它利用ALSA API播放鼓声,并通过UDP和WebSocket通信与Web应用进行交互,允许用户通过Web应用控制节奏播放。 ## 项目的主要特性和功能 播放鼓节奏应用支持三种主要的鼓声低音鼓、军鼓和铛。 用户控制通过Web应用控制节奏的速度、音量和鼓声类型。 多线程处理利用多线程处理加速度计输入和节奏播放,实现实时响应。 网络通信应用通过UDP和WebSocket与Web应用通信,允许用户远程控制。 ## 安装使用步骤 1. 安装依赖 安装g++armlinuxgnueabihf编译器sudo aptget install g++armlinuxgnueabihf。 设置CMake编译器路径为usrbinarmlinuxgnueabihfg++。

    Xiaosi Artificial Intelligence Project-AI人工智能资源

    XIAO SI AI ()

    PLCv17水塔水位程序

    PLCv17水塔水位程序

    Python版自动组卷评卷考试系统源码+文档报告(高分大作业)

    Python版自动组卷评卷考试系统源码+文档报告(高分大作业),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)Python版自动组卷评卷考试系统源码+文档报告(高分大作业)

    使用Koopman理论识别机器人动力学的非线性系统附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。

    助产学-助产学+创新成果报告.pdf

    助产学-助产学+创新成果报告.pdf

    基于深度学习的车牌识别源码(Python毕业设计)

    基于深度学习的车牌识别源码(Python毕业设计),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Python毕业设计)基于深度学习的车牌识别源码(Py

    工商银行2023商业银行业务架构应用的研究与实践白皮书33页.pdf

    工商银行2023商业银行业务架构应用的研究与实践白皮书33页.pdf

    wnmp PHP集成环境-PHP资源

    c# wpfwnmp PHPissues

    史上最全linux基础指令

    包括全部基础linux指令,最受初学linux者欢迎!

    基于SpringBoot的驾校管理系统(源码+数据库)

    541驾校管理系统,系统包含三种角色:管理员、学员,教练主要功能如下。 【学员功能】 1. **首页:** 获取驾校最新信息。 2. **驾校车辆:** 查看驾校提供的车辆信息。 3. **考试安排:** 查看个人的考试安排和时间表。 4. **驾驶知识:** 学习和获取驾驶知识。 5. **笔试考试:** 进行驾驶笔试模拟考试。 6. **驾校公告:** 浏览驾校发布的公告信息。 7. **后台管理:** 管理个人预约信息、取消预约、考试预约、取消考试和学员成绩。 【管理员功能】 1. **首页:** 查看整体系统。 2. **个人中心:** 修改密码和管理个人信息。 3. **学员管理:** 管理学员信息,包括注册和审核。 4. **驾校教练管理:** 管理教练信息,包括教练的资质和审核。 5. **驾校车辆管理:** 管理驾校提供的车辆信息。 6. **预约信息管理:** 管理学员的预约信息,包括取消预约和考试预约。 7. **取消预约管理:** 处理学员取消预约的请求。 8. **考试安排管理:** 管理驾校的考试安排。 9. **考试预约管理:** 管理学员的考试预约信息

Global site tag (gtag.js) - Google Analytics