Process 執行命令行Java封裝類

podc9bw2 8年前發布 | 41K 次閱讀 C/C++ Android Java

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

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

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("]");
        str = 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);
        }
    }
}

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

 本文由用戶 podc9bw2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!