成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分享 Process 執行命令行封裝類

移動開發 Android
進行多次測試后發現是因為沒有正常退出進程,以及完全讀取掉流數據,和關閉流導致的問題。 在多次優化后,建立如下封裝類:

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

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

ProcessModel.java

  1. import java.io.BufferedReader; 
  2. import java.io.IOException; 
  3. import java.io.InputStream; 
  4. import java.io.InputStreamReader; 
  5. import java.io.OutputStream; 
  6.    
  7. /** 
  8.  * Create By Qiujuer 
  9.  * 2014-07-26 
  10.  * <p/> 
  11.  * 執行命令行語句靜態方法封裝 
  12.  */ 
  13. public class ProcessModel { 
  14.     //換行符 
  15.     private static final String BREAK_LINE; 
  16.     //執行退出命令 
  17.     private static final byte[] COMMAND_EXIT; 
  18.     //錯誤緩沖 
  19.     private static byte[] BUFFER; 
  20.    
  21.     /** 
  22.      * 靜態變量初始化 
  23.      */ 
  24.     static { 
  25.         BREAK_LINE = "\n"
  26.         COMMAND_EXIT = "\nexit\n".getBytes(); 
  27.         BUFFER = new byte[32]; 
  28.     } 
  29.    
  30.    
  31.     /** 
  32.      * 執行命令 
  33.      * 
  34.      * @param params 命令參數 
  35.      *               <pre> eg: "/system/bin/ping", "-c", "4", "-s", "100","www.qiujuer.net"</pre> 
  36.      * @return 執行結果 
  37.      */ 
  38.     public static String execute(String... params) { 
  39.         Process process = null
  40.         StringBuilder sbReader = null
  41.    
  42.         BufferedReader bReader = null
  43.         InputStreamReader isReader = null
  44.    
  45.         InputStream in = null
  46.         InputStream err = null
  47.         OutputStream out = null
  48.    
  49.         try { 
  50.             process = new ProcessBuilder() 
  51.                     .command(params) 
  52.                     .start(); 
  53.             out = process.getOutputStream(); 
  54.             in = process.getInputStream(); 
  55.             err = process.getErrorStream(); 
  56.    
  57.             out.write(COMMAND_EXIT); 
  58.             out.flush(); 
  59.    
  60.             process.waitFor(); 
  61.    
  62.             isReader = new InputStreamReader(in); 
  63.             bReader = new BufferedReader(isReader); 
  64.    
  65.             String s; 
  66.             if ((s = bReader.readLine()) != null) { 
  67.                 sbReader = new StringBuilder(); 
  68.                 sbReader.append(s); 
  69.                 sbReader.append(BREAK_LINE); 
  70.                 while ((s = bReader.readLine()) != null) { 
  71.                     sbReader.append(s); 
  72.                     sbReader.append(BREAK_LINE); 
  73.                 } 
  74.             } 
  75.    
  76.             while ((err.read(BUFFER)) > 0) { 
  77.             } 
  78.         } catch (IOException e) { 
  79.             e.printStackTrace(); 
  80.         } catch (Exception e) { 
  81.             e.printStackTrace(); 
  82.         } finally { 
  83.             closeAllStream(out, err, in, isReader, bReader); 
  84.    
  85.             if (process != null) { 
  86.                 processDestroy(process); 
  87.                 process = null
  88.             } 
  89.         } 
  90.    
  91.         if (sbReader == null) 
  92.             return null; 
  93.         else 
  94.             return sbReader.toString(); 
  95.     } 
  96.    
  97.     /** 
  98.      * 關閉所有流 
  99.      * 
  100.      * @param out      輸出流 
  101.      * @param err      錯誤流 
  102.      * @param in       輸入流 
  103.      * @param isReader 輸入流封裝 
  104.      * @param bReader  輸入流封裝 
  105.      */ 
  106.     private static void closeAllStream(OutputStream out, InputStream err, InputStream in, InputStreamReader isReader, BufferedReader bReader) { 
  107.         if (out != null) 
  108.             try { 
  109.                 out.close(); 
  110.             } catch (IOException e) { 
  111.                 e.printStackTrace(); 
  112.             } 
  113.         if (err != null) 
  114.             try { 
  115.                 err.close(); 
  116.             } catch (IOException e) { 
  117.                 e.printStackTrace(); 
  118.             } 
  119.         if (in != null) 
  120.             try { 
  121.                 in.close(); 
  122.             } catch (IOException e) { 
  123.                 e.printStackTrace(); 
  124.             } 
  125.         if (isReader != null) 
  126.             try { 
  127.                 isReader.close(); 
  128.             } catch (IOException e) { 
  129.                 e.printStackTrace(); 
  130.             } 
  131.         if (bReader != null) 
  132.             try { 
  133.                 bReader.close(); 
  134.             } catch (IOException e) { 
  135.                 e.printStackTrace(); 
  136.             } 
  137.     } 
  138.    
  139.    
  140.     /** 
  141.      * 通過Android底層實現進程關閉 
  142.      * 
  143.      * @param process 進程 
  144.      */ 
  145.     private static void killProcess(Process process) { 
  146.         int pid = getProcessId(process); 
  147.         if (pid != 0) { 
  148.             try { 
  149.                 //android kill process 
  150.                 android.os.Process.killProcess(pid); 
  151.             } catch (Exception e) { 
  152.                 try { 
  153.                     process.destroy(); 
  154.                 } catch (Exception ex) { 
  155.                 } 
  156.             } 
  157.         } 
  158.     } 
  159.    
  160.     /** 
  161.      * 獲取進程的ID 
  162.      * 
  163.      * @param process 進程 
  164.      * @return 
  165.      */ 
  166.     private static int getProcessId(Process process) { 
  167.         String str = process.toString(); 
  168.         try { 
  169.             int i = str.indexOf("=") + 1; 
  170.             int j = str.indexOf("]"); 
  171.             strstr = str.substring(i, j); 
  172.             return Integer.parseInt(str); 
  173.         } catch (Exception e) { 
  174.             return 0; 
  175.         } 
  176.     } 
  177.    
  178.     /** 
  179.      * 銷毀進程 
  180.      * 
  181.      * @param process 進程 
  182.      */ 
  183.     private static void processDestroy(Process process) { 
  184.         if (process != null) { 
  185.             try { 
  186.                 //判斷是否正常退出 
  187.                 if (process.exitValue() != 0) { 
  188.                     killProcess(process); 
  189.                 } 
  190.             } catch (IllegalThreadStateException e) { 
  191.                 killProcess(process); 
  192.             } 
  193.         } 
  194.     } 

在進行批量壓力測試到達125643個線程的時候都沒有出現此問題;特此分享給大家

本文鏈接:http://blog.csdn.net/qiujuer/article/details/38142273

責任編輯:chenqingxiang 來源: oschina
相關推薦

2021-05-31 12:05:46

Shell命令Linux

2011-07-21 13:10:59

2010-02-05 14:59:31

C++命令行模式編譯設

2020-12-10 16:16:08

工具代碼開發

2020-12-11 06:44:16

命令行工具開發

2020-05-07 19:46:18

LinuxMySQLMariaDB

2020-03-31 08:30:00

ffsendFireFox SenLinux

2010-12-02 14:29:07

nmap

2015-07-01 09:15:46

linuxQuora命令行

2009-12-29 14:36:29

Ubuntu cron

2018-06-07 08:25:20

Linux命令行GNU Paralle

2016-10-12 08:38:24

Windows 10Defender命令行

2010-07-15 09:37:47

Perl命令行

2010-09-01 14:23:54

Linux命令行開發

2010-08-20 10:05:23

用戶命令

2009-07-20 09:55:30

華為命令行解析華為認證

2019-07-23 13:45:38

LinuxFedora權限

2010-11-24 15:33:59

mysql命令行參數

2010-11-01 14:01:32

DB2命令行

2010-03-10 17:23:37

Python 命令行參
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 我要看免费一级毛片 | 亚洲欧美日韩成人在线 | 高清国产午夜精品久久久久久 | 成人av网站在线观看 | 99久久久99久久国产片鸭王 | 中文字幕国产视频 | 中国一级特黄真人毛片 | 亚洲午夜精品在线观看 | 成人在线免费观看 | 中文字幕在线精品 | 99re视频在线观看 | 国产精品亚洲第一 | 久久精品色欧美aⅴ一区二区 | 69精品久久久久久 | 99热在线观看精品 | 亚洲天天干| 中文字幕亚洲视频 | 国内精品在线视频 | 日韩一区二区三区视频在线观看 | 7777久久 | 欧美日高清 | www.成人在线视频 | 日韩欧美精品 | 男人天堂国产 | 久久里面有精品 | 国产精品高潮呻吟久久 | 国产欧美精品一区二区 | 日韩毛片网| 精品欧美一区二区三区免费观看 | 偷拍自拍网址 | 国产成人精品久久二区二区91 | 色av一区 | 欧美日韩精品中文字幕 | 四虎永久免费在线 | av二区三区 | 99av成人精品国语自产拍 | 啪啪免费 | 午夜精品久久久久久久久久久久 | 久久亚洲国产 | 欧美一级黄带 | 欧洲成人午夜免费大片 |