91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Process 執行命令行封裝類

發布時間:2021-11-11 21:41:35 來源:億速云 閱讀:161 作者:柒染 欄目:移動開發

今天就跟大家聊聊有關如何理解Process 執行命令行封裝類,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

進行多次測試后發現是因為沒有正常退出進程,以及完全讀取掉流數據,和關閉流導致的問題。

在多次優化后,建立如下封裝類:

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  * <p/>  * 執行命令行語句靜態方法封裝  */ 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 命令參數      *               <pre> eg: "/system/bin/ping", "-c", "4", "-s", "100","www.qiujuer.net"</pre>      * @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 執行命令行封裝類有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

观塘区| 施秉县| 杭锦后旗| 鹤山市| 樟树市| 丹江口市| 且末县| 彭水| 习水县| 宝兴县| 增城市| 上犹县| 调兵山市| 利川市| 合肥市| 吉林市| 蒲城县| 松阳县| 富平县| 方山县| 紫阳县| 鄂伦春自治旗| 保定市| 邛崃市| 洪雅县| 饶河县| 米易县| 措美县| 新乐市| 龙胜| 报价| 林西县| 朔州市| 寿阳县| 景谷| 砚山县| 马山县| 安溪县| 临颍县| 望江县| 西青区|