亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java使用Runtime執(zhí)行系統(tǒng)命令遇到的問題

 更新時間:2021年11月03日 08:40:47   作者:zpzkitt  
這篇文章主要介紹了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:設(shè)置環(huán)境變量,值是:環(huán)境變量名=環(huán)境變量值,例如 JAVA_HOEM=/usr/lib/java1.8
  • dir:設(shè)置命令執(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加空格當(dāng)成一個整體作為一個命令執(zhí)行,就會出現(xiàn)命令找不到,但是報的錯誤日志如果不注意很容易忽略這個空格,就只能一直苦惱。所以正確的方式就是把所有默認(rèn)分隔符全都刪掉,只用自己的分隔符就可以了。

下面是實(shí)現(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)容當(dāng)作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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談Java中類的實(shí)例化步驟

    淺談Java中類的實(shí)例化步驟

    今天小編就為大家分享一篇關(guān)于淺談Java中類的實(shí)例化步驟,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 史上最佳springboot Locale 國際化方案

    史上最佳springboot Locale 國際化方案

    今天給大家分享史上最佳springboot Locale 國際化方案,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • java基于Des對稱加密算法實(shí)現(xiàn)的加密與解密功能詳解

    java基于Des對稱加密算法實(shí)現(xiàn)的加密與解密功能詳解

    這篇文章主要介紹了java基于Des對稱加密算法實(shí)現(xiàn)的加密與解密功能,結(jié)合實(shí)例形式詳細(xì)分析了Des加密算法的功能、原理、使用方法與相關(guān)注意事項,需要的朋友可以參考下
    2017-01-01
  • Mybatis實(shí)現(xiàn)插入數(shù)據(jù)后返回主鍵過程解析

    Mybatis實(shí)現(xiàn)插入數(shù)據(jù)后返回主鍵過程解析

    這篇文章主要介紹了Mybatis實(shí)現(xiàn)插入數(shù)據(jù)后返回主鍵過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java線程通信之wait-notify通信方式詳解

    Java線程通信之wait-notify通信方式詳解

    這篇文章主要為大家詳細(xì)介紹了Java線程通信之wait-notify通信方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 淺談MyBatis Plus主鍵設(shè)置策略

    淺談MyBatis Plus主鍵設(shè)置策略

    本文主要介紹了MyBatis Plus主鍵設(shè)置策略,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 將15位身份證補(bǔ)全為18位身份證的算法示例詳解

    將15位身份證補(bǔ)全為18位身份證的算法示例詳解

    這篇文章主要給大家介紹了關(guān)于將15位身份證補(bǔ)全為18位身份證算法的相關(guān)資料,文中通過示例代碼給大家介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • SpringBoot淺析安全管理之高級配置

    SpringBoot淺析安全管理之高級配置

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理之高級配置
    2022-08-08
  • Android中PreferenceFragment的使用詳解

    Android中PreferenceFragment的使用詳解

    本文主要介紹了Android中PreferenceFragment的使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring Cloud Ubuntu環(huán)境部署的步驟與注意事項

    Spring Cloud Ubuntu環(huán)境部署的步驟與注意事項

    這篇文章主要給大家介紹了關(guān)于Spring Cloud Ubuntu環(huán)境部署的步驟與注意事項,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Cloud具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論