ProcessBuilder的使用(執行多行命令,實時獲取日誌)

ProcessBuilder用來創建操作系統進程,可以在指定位置,執行指定命令。這裏通過process實現java執行shell,python腳本的功能。

1.通過ProcessBuilder執行多行命令

由於需要在命令中設置Path,試了多種方式後,使用cmd/bash封裝爲一整個命令實現,其中windows環境下使用cmd,linux環境下使用/bin/bash。

windows代碼如下:多行命令通過分號分割

List<String> commandList = new ArrayList<>();
commandList .add("cmd");
commandList .add("/c");
commandList .add("your command");
ProcessBuilder pb = new ProcessBuilder(commandList);

linux代碼:

List<String> commandList = new ArrayList<>();
commandList .add("/bin/bash");
commandList .add("/c");
commandList .add("your command");
ProcessBuilder pb = new ProcessBuilder(commandList);

多個命令通過在list添加新元素即可,由ProcessBuilder自行拼接最終的命令。至此,可以創建同時執行多行命令的Process。

2.實時獲取日誌

此處較簡單,只是對Process的API的使用,代碼如下:

Process process = processBuilder.start();

try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))){
    //循環等待進程輸出,判斷進程存活則循環獲取輸出流數據
    while (process.isAlive()) {
        while (bufferedReader.ready()) {
            String s = bufferedReader.readLine();
            //自定義進程輸出處理
            *****
        }
    }
}

//獲取執行結果
int status = process.waitFor();

這樣就可以實時獲取進程日誌,在最後獲取進程執行結果用以記錄。

3.進程輸出直接存爲文件

ProcessBuilder提供了簡單的方法記錄進程日誌,此處因爲還要對信息進行一些處理,所以自定義了處理邏輯。

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
//統一異常輸出和正常輸出
pb.redirectErrorStream(true);
//將輸出流重定向到日誌文件
File log = new File("log");
pb.redirectOutput(Redirect.appendTo(log));

此處需要注意,設置了輸出重定向後,process.getInputStream()獲取到的輸出流爲空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章