如何理解Process执行命令行封装类

今天就跟大家聊聊有关如何理解Process 执行命令行封装类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

我们拥有10多年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供网站设计制作、成都网站制作、微信开发、小程序设计、手机网站开发、H5响应式网站、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。

进行多次测试后发现是因为没有正常退出进程,以及完全读取掉流数据,和关闭流导致的问题。

在多次优化后,建立如下封装类:

ProcessModel.java

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream;    /**  * Create By Qiujuer  * 2014-07-26  * 

  * 执行命令行语句静态方法封装  */ public class ProcessModel {     //换行符     private static final String BREAK_LINE;     //执行退出命令     private static final byte[] COMMAND_EXIT;     //错误缓冲     private static byte[] BUFFER;        /**      * 静态变量初始化      */     static {         BREAK_LINE = "\n";         COMMAND_EXIT = "\nexit\n".getBytes();         BUFFER = new byte[32];     }           /**      * 执行命令      *      * @param params 命令参数      *               

 eg: "/system/bin/ping", "-c", "4", "-s", "100","www.qiujuer.net"
      * @return 执行结果      */     public static String execute(String... params) {         Process process = null;         StringBuilder sbReader = null;            BufferedReader bReader = null;         InputStreamReader isReader = null;            InputStream in = null;         InputStream err = null;         OutputStream out = null;            try {             process = new ProcessBuilder()                     .command(params)                     .start();             out = process.getOutputStream();             in = process.getInputStream();             err = process.getErrorStream();                out.write(COMMAND_EXIT);             out.flush();                process.waitFor();                isReader = new InputStreamReader(in);             bReader = new BufferedReader(isReader);                String s;             if ((s = bReader.readLine()) != null) {                 sbReader = new StringBuilder();                 sbReader.append(s);                 sbReader.append(BREAK_LINE);                 while ((s = bReader.readLine()) != null) {                     sbReader.append(s);                     sbReader.append(BREAK_LINE);                 }             }                while ((err.read(BUFFER)) > 0) {             }         } catch (IOException e) {             e.printStackTrace();         } catch (Exception e) {             e.printStackTrace();         } finally {             closeAllStream(out, err, in, isReader, bReader);                if (process != null) {                 processDestroy(process);                 process = null;             }         }            if (sbReader == null)             return null;         else             return sbReader.toString();     }        /**      * 关闭所有流      *      * @param out      输出流      * @param err      错误流      * @param in       输入流      * @param isReader 输入流封装      * @param bReader  输入流封装      */     private static void closeAllStream(OutputStream out, InputStream err, InputStream in, InputStreamReader isReader, BufferedReader bReader) {         if (out != null)             try {                 out.close();             } catch (IOException e) {                 e.printStackTrace();             }         if (err != null)             try {                 err.close();             } catch (IOException e) {                 e.printStackTrace();             }         if (in != null)             try {                 in.close();             } catch (IOException e) {                 e.printStackTrace();             }         if (isReader != null)             try {                 isReader.close();             } catch (IOException e) {                 e.printStackTrace();             }         if (bReader != null)             try {                 bReader.close();             } catch (IOException e) {                 e.printStackTrace();             }     }           /**      * 通过Android底层实现进程关闭      *      * @param process 进程      */     private static void killProcess(Process process) {         int pid = getProcessId(process);         if (pid != 0) {             try {                 //android kill process                 android.os.Process.killProcess(pid);             } catch (Exception e) {                 try {                     process.destroy();                 } catch (Exception ex) {                 }             }         }     }        /**      * 获取进程的ID      *      * @param process 进程      * @return      */     private static int getProcessId(Process process) {         String str = process.toString();         try {             int i = str.indexOf("=") + 1;             int j = str.indexOf("]");             strstr = str.substring(i, j);             return Integer.parseInt(str);         } catch (Exception e) {             return 0;         }     }        /**      * 销毁进程      *      * @param process 进程      */     private static void processDestroy(Process process) {         if (process != null) {             try {                 //判断是否正常退出                 if (process.exitValue() != 0) {                     killProcess(process);                 }             } catch (IllegalThreadStateException e) {                 killProcess(process);             }         }     } }

在进行批量压力测试到达125643个线程的时候都没有出现此问题。

看完上述内容,你们对如何理解Process 执行命令行封装类有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


文章名称:如何理解Process执行命令行封装类
标题链接:http://hbruida.cn/article/isjpid.html