`
ouyangfeng521
  • 浏览: 248709 次
  • 性别: 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;
        }

    }

}
 
分享到:
评论

相关推荐

    Windows Shell 编程.pdf

    在使用上一般都是直接利用windows的外壳API做一些工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人员对windows shell的扩展编程不很了解,也缺乏这方面的资料。...

    解决Windows下PHP的exec、shell_exec等函数不能正常运行的方法

    总之,`exec`和`shell_exec`函数在Windows下的权限问题可以通过调整`cmd.exe`的权限来解决,但在实施之前,务必考虑其可能带来的安全影响。在生产环境中,应尽可能遵循最小权限原则,以降低潜在的安全风险。

    Windows Shell 编程指南与实例

    《Windows Shell 编程指南与实例》是一本深入探讨Windows操作系统壳层编程技术的专业书籍。在Windows系统中,Shell指...无论是个人电脑的日常维护,还是企业级的系统管理,Windows Shell编程都能成为你不可或缺的工具。

    windows adb shell tab键补全

    下面将详细讲解如何在Windows CMD中使用`adb shell`及`tab`键补全功能。 1. **adb简介** `adb`是Android SDK的一部分,它提供了一个命令行接口,用于连接、管理和控制Android设备或模拟器。开发者可以使用adb进行...

    Windows中SSH Secure Shell Client 的使用方法doc

    ### Windows中SSH Secure Shell Client 的使用方法 #### 一、概述 本文档旨在详细介绍如何在Windows环境下使用SSH Secure Shell Client进行安全的远程访问与文件传输。通过本教程,您将学习到从软件的下载安装、...

    Windows shell编程.pdf

    - **重要性**: 使用Windows Shell编程可以提升应用程序与操作系统的整合度,让程序更加贴近用户的需求,例如自定义开始菜单、创建特殊的文件夹类型等。 - **适用人群**: 适合希望深入了解Windows系统内部运作机制的...

    visual c++ windows shell programming.rarvisual c++ windows shell programming

    《Visual C++ Windows Shell Programming》是一本专注于使用Visual C++进行Windows Shell编程的权威指南。在Windows操作系统中,Shell指的是用户界面以及与之交互的各种组件,包括桌面、开始菜单、任务栏等。这本书...

    Windows Shell编程示例

    5. **CppShellExtPreviewHandler**和**RecipePreviewHandler.cpp**: 预览处理器是Windows Shell中的一个重要组件,它使得用户能够在不打开文件的情况下预览文件内容。`RecipePreviewHandler`可能是一个具体的预览...

    windows下的shell环境模拟

    windows下的shell环境模拟程序集合,从cygwin下提取出来,包含常用的命令集合:basename/dirname/mkdir/mv/rm/cp/sort/split/find/awk/sed/xargs/tar/grep/gzip/zip/unzip/head/tail/ls/cat/uniq/wc/more/scp/ssh/...

    Microsoft.WindowsAPICodePack和SHell的DLL

    在.NET框架的开发环境中,有时候我们需要调用Windows操作系统底层的功能,比如管理文件、控制桌面图标、操作任务栏等,这时就离不开对Windows API的使用。Microsoft.WindowsAPICodePack(简称APICodePack)是一个...

    Visual C++ Windows Shell Programming(- Dino )

    《Visual C++ Windows Shell Programming》是由Dino Esposito撰写的一本专著,主要探讨了如何使用Microsoft的Visual C++编程环境来实现Windows壳层(Shell)应用。这本书是英文版,面向熟悉C++编程语言并希望深入...

    Windows Shell Programming

    ### Windows Shell Programming 知识点概述 #### 一、Windows Shell 编程基础 - **定义与作用**:Windows Shell 是一个用户界面层,用于帮助用户与操作系统进行交互。它包括了诸如“我的电脑”、“资源管理器”等...

    windows版本 mongodb shell:mongosh-2.2.6-win32-x64.zip

    windows版本 mongodb shell:mongosh-2.2.6-win32-x64.zip mongodb shell :https://www.mongodb.com/try/download/shell mongodb相关官网下载地址: mongodb社区版:...

    windows shell 编程源码

    Windows Shell编程是Windows操作系统下的一种高级用户界面编程技术,它涉及到与系统桌面环境的交互,如创建快捷方式、自定义右键菜单、控制面板应用程序以及桌面小工具等。本资源包含了一系列的源代码,用于帮助...

    Windows+Shell扩展编程完全指南.zip

    这些接口提供了与Windows Shell交互的方法,让开发者能够定制文件或文件夹在资源管理器中的显示方式和行为。 1. **缩略图视图**:通过实现IExtractIcon和IExtractImage接口,开发者可以为特定文件类型提供自定义的...

    Windows下搭建Shell编译环境(3)

    Windows下搭建Shell编译环境(3)

    windows shell program code

    Windows Shell编程是Windows操作系统中的一种技术,它允许开发者创建与操作系统界面交互的程序,比如桌面小工具、快捷方式脚本或者自定义右键菜单。Shell编程通常涉及到批处理脚本(Batch Scripting)和Windows脚本...

    Visual C++ Windows Shell Programming

    《Visual C++ Windows Shell Programming》这本书便是一本专门讲解如何使用Visual C++来开发Windows Shell程序的指南。 #### 二、Windows Shell 概述 **Windows Shell**是Windows操作系统的图形用户界面的核心组件...

    windows下shell命令大全

    ### Windows 下 Shell 命令大全 在 Windows 操作系统中,shell 命令是进行各种管理和配置任务的重要工具之一。本文将详细介绍一系列常用的 shell 命令及其用途,这些命令对于 Windows 开发者来说非常实用。 #### 1...

    windows shell扩展傻瓜大全

    总之,《Windows Shell 扩展傻瓜大全》是一份面向中高级开发者的指南,它不仅涵盖了Shell扩展的基础知识,还提供了实践示例,帮助开发者快速上手并掌握如何增强Windows Explorer的功能。尽管原文翻译可能存在不足,...

Global site tag (gtag.js) - Google Analytics