java使用Runtime執(zhí)行系統(tǒng)命令遇到的問題
使用Runtime執(zhí)行系統(tǒng)命令遇到的問題
java執(zhí)行系統(tǒng)命令的工具,Runtime.getRuntime().exec(),這個工具里面的坑還是不少的,大部分網(wǎng)上已經(jīng)分析了,我遇到一個沒有在網(wǎng)上找到的。
首先說一下這個坑,在command中如果參數(shù)的內(nèi)容中有空格、tab、換行符、回車符,就會執(zhí)行失敗,例如:grep "abc def" -r -n ./這是因為exec方法使用的是StringTokenizer對command分割的。
參數(shù)含義
command:要執(zhí)行的命令。envp:設置環(huán)境變量,值是:環(huán)境變量名=環(huán)境變量值,例如 JAVA_HOEM=/usr/lib/java1.8dir:設置命令執(zhí)行的目錄
public Process exec(String command, String[] envp, File dir)
throws IOException {
if (command.length() == 0)
throw new IllegalArgumentException("Empty command");
StringTokenizer st = new StringTokenizer(command);
String[] cmdarray = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++)
cmdarray[i] = st.nextToken();
return exec(cmdarray, envp, dir);
}
為了解決這個問題我自己寫了一個可以自定義分隔符的類。
這個類中的第二個exec可以自定義分割符,但是也有一個需要注意的地方
假如分隔符是“&&” 要執(zhí)行的命令這樣寫 : grep &&"abc&&def"&&-r&&-n&&./ 執(zhí)行也會報錯,以為grep后面有個空格,它會把grep加空格當成一個整體作為一個命令執(zhí)行,就會出現(xiàn)命令找不到,但是報的錯誤日志如果不注意很容易忽略這個空格,就只能一直苦惱。所以正確的方式就是把所有默認分隔符全都刪掉,只用自己的分隔符就可以了。
下面是實現(xiàn)代碼
import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;
public class GxExec {
private static GxExec gxExec = new GxExec();
public static GxExec getGxExec() {
return gxExec;
}
private GxExec() {}
public Process exec(String[] cmdarray, String[] envp, File dir)
throws IOException {
return new ProcessBuilder(cmdarray)
.start();
}
public Process exec(String command, String delim)
throws IOException {
if (command.length() == 0) {
throw new IllegalArgumentException("Empty command");
}
StringTokenizer st = new StringTokenizer(command, delim);
String[] cmdarray = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++) {
cmdarray[i] = st.nextToken();
System.out.println(cmdarray[i]);
}
return exec(cmdarray, null, null);
}
}
java Runtime.exec() 執(zhí)行
Runtime.exec()不等同于直接執(zhí)行command line命令!Runtime.exec()很有局限性,對有些命令不能直接把command line里的內(nèi)容當作String參數(shù)傳給exec().
比如重定向等命令。
舉個例子
javap -l xxx > output.txt
這時要用到exec的第二種重載,即input 參數(shù)為String[]:
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","javap -l xxx > output.txt"});
rm -rf name*
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","rm -rf name*"});
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java基于Des對稱加密算法實現(xiàn)的加密與解密功能詳解
這篇文章主要介紹了java基于Des對稱加密算法實現(xiàn)的加密與解密功能,結合實例形式詳細分析了Des加密算法的功能、原理、使用方法與相關注意事項,需要的朋友可以參考下2017-01-01
Mybatis實現(xiàn)插入數(shù)據(jù)后返回主鍵過程解析
這篇文章主要介紹了Mybatis實現(xiàn)插入數(shù)據(jù)后返回主鍵過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06
Android中PreferenceFragment的使用詳解
本文主要介紹了Android中PreferenceFragment的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Spring Cloud Ubuntu環(huán)境部署的步驟與注意事項
這篇文章主要給大家介紹了關于Spring Cloud Ubuntu環(huán)境部署的步驟與注意事項,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Cloud具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-12-12

