zoukankan      html  css  js  c++  java
  • Android 用java语言执行Shell命令

    最近项目中需要用到java语言来执行shell命令,在网上查了资料, 把自己在项目里用到的命令整理成了工具类开放给大家,希望对大家有用。功能不全,后期我会慢慢添加整合。

    public class ShellUtils {
     
     
        public static final String COMMAND_SU = "su";
        public static final String COMMAND_SH = "sh";
        public static final String COMMAND_EXIT = "exit
    ";
        public static final String COMMAND_LINE_END = "
    ";
     
     
        private ShellUtils() {
            throw new AssertionError();
        }
     
     
        /**
         * 查看是否有了root权限
         * 
         * @return
         */
        public static boolean checkRootPermission() {
            return execCommand("echo root", true, false).result == 0;
        }
     
     
        /**
         * 执行shell命令,默认返回结果
         * 
         * @param command
         *            command
         * @param 运行是否需要root权限
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(String command, boolean isRoot) {
            return execCommand(new String[] { command }, isRoot, true);
        }
     
     
        /**
         * 执行shell命令,默认返回结果
         * 
         * @param commands
         *            command list
         * @param 运行是否需要root权限
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(List<String> commands,
                boolean isRoot) {
            return execCommand(
                    commands == null ? null : commands.toArray(new String[] {}),
                    isRoot, true);
        }
     
     
        /**
         * 执行shell命令,默认返回结果
         * 
         * @param commands
         *            command array
         * @param 运行是否需要root权限
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(String[] commands, boolean isRoot) {
            return execCommand(commands, isRoot, true);
        }
     
     
        /**
         * execute shell command
         * 
         * @param command
         *            command
         * @param 运行是否需要root权限
         * @param isNeedResultMsg
         *            whether need result msg
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(String command, boolean isRoot,
                boolean isNeedResultMsg) {
            return execCommand(new String[] { command }, isRoot, isNeedResultMsg);
        }
     
     
        /**
         * execute shell commands
         * 
         * @param commands
         *            command list
         * @param 运行是否需要root权限
         * @param 是否需要返回运行结果
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(List<String> commands,
                boolean isRoot, boolean isNeedResultMsg) {
            return execCommand(
                    commands == null ? null : commands.toArray(new String[] {}),
                    isRoot, isNeedResultMsg);
        }
     
     
        /**
         * execute shell commands
         * 
         * @param commands
         *            command array
          * @param 运行是否需要root权限
         * @param 是否需要返回运行结果
         * @return <ul>
         *         <li>if isNeedResultMsg is false, {@link CommandResult#successMsg}
         *         is null and {@link CommandResult#errorMsg} is null.</li>
         *         <li>if {@link CommandResult#result} is -1, there maybe some
         *         excepiton.</li>
         *         </ul>
         */
        public static CommandResult execCommand(String[] commands, boolean isRoot,
                boolean isNeedResultMsg) {
            int result = -1;
            if (commands == null || commands.length == 0) {
                return new CommandResult(result, null, null);
            }
     
     
            Process process = null;
            BufferedReader successResult = null;
            BufferedReader errorResult = null;
            StringBuilder successMsg = null;
            StringBuilder errorMsg = null;
     
     
            DataOutputStream os = null;
            try {
                process = Runtime.getRuntime().exec(
                        isRoot ? COMMAND_SU : COMMAND_SH);
                os = new DataOutputStream(process.getOutputStream());
                for (String command : commands) {
                    if (command == null) {
                        continue;
                    }
     
     
                    // donnot use os.writeBytes(commmand), avoid chinese charset
                    // error
                    os.write(command.getBytes());
                    os.writeBytes(COMMAND_LINE_END);
                    os.flush();
                }
                os.writeBytes(COMMAND_EXIT);
                os.flush();
     
     
                result = process.waitFor();
                // get command result
                if (isNeedResultMsg) {
                    successMsg = new StringBuilder();
                    errorMsg = new StringBuilder();
                    successResult = new BufferedReader(new InputStreamReader(
                            process.getInputStream()));
                    errorResult = new BufferedReader(new InputStreamReader(
                            process.getErrorStream()));
                    String s;
                    while ((s = successResult.readLine()) != null) {
                        successMsg.append(s);
                    }
                    while ((s = errorResult.readLine()) != null) {
                        errorMsg.append(s);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (os != null) {
                        os.close();
                    }
                    if (successResult != null) {
                        successResult.close();
                    }
                    if (errorResult != null) {
                        errorResult.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
     
     
                if (process != null) {
                    process.destroy();
                }
            }
            return new CommandResult(result, successMsg == null ? null
                    : successMsg.toString(), errorMsg == null ? null
                    : errorMsg.toString());
        }
     
     
        /**
         * 运行结果
         * <ul>
         * <li>{@link CommandResult#result} means result of command, 0 means normal,
         * else means error, same to excute in linux shell</li>
         * <li>{@link CommandResult#successMsg} means success message of command
         * result</li>
         * <li>{@link CommandResult#errorMsg} means error message of command result</li>
         * </ul>
         * 
         * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a>
         *         2013-5-16
         */
        public static class CommandResult {
     
     
            /** 运行结果 **/
            public int result;
            /** 运行成功结果 **/
            public String successMsg;
            /** 运行失败结果 **/
            public String errorMsg;
     
     
            public CommandResult(int result) {
                this.result = result;
            }
     
     
            public CommandResult(int result, String successMsg, String errorMsg) {
                this.result = result;
                this.successMsg = successMsg;
                this.errorMsg = errorMsg;
            }
        }
    }
  • 相关阅读:
    缓动动画的原理
    高级各行高亮显示
    返回顶部的小火箭
    事件委托
    原型链和原型的继承
    对象的构建和构造函数
    call、apply和bind
    闭包
    九宫格封装好的组件 样式可以自由改哦
    嘿嘿嘿嘿 马上就有新任务了 提前封装一个转盘抽奖组件
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/10495214.html
Copyright © 2011-2022 走看看