欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年11月03日 08:40:47   作者:zpzkitt  
這篇文章主要介紹了java使用Runtime執(zhí)行系統(tǒng)命令遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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

java執(zhí)行系統(tǒng)命令的工具,Runtime.getRuntime().exec(),這個(gè)工具里面的坑還是不少的,大部分網(wǎng)上已經(jīng)分析了,我遇到一個(gè)沒(méi)有在網(wǎng)上找到的。

首先說(shuō)一下這個(gè)坑,在command中如果參數(shù)的內(nèi)容中有空格、tab、換行符、回車(chē)符,就會(huì)執(zhí)行失敗,例如:grep "abc def" -r -n ./這是因?yàn)閑xec方法使用的是StringTokenizer對(duì)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);
    }

為了解決這個(gè)問(wèn)題我自己寫(xiě)了一個(gè)可以自定義分隔符的類(lèi)。

這個(gè)類(lèi)中的第二個(gè)exec可以自定義分割符,但是也有一個(gè)需要注意的地方

假如分隔符是“&&” 要執(zhí)行的命令這樣寫(xiě) : grep &&"abc&&def"&&-r&&-n&&./ 執(zhí)行也會(huì)報(bào)錯(cuò),以為grep后面有個(gè)空格,它會(huì)把grep加空格當(dāng)成一個(gè)整體作為一個(gè)命令執(zhí)行,就會(huì)出現(xiàn)命令找不到,但是報(bào)的錯(cuò)誤日志如果不注意很容易忽略這個(gè)空格,就只能一直苦惱。所以正確的方式就是把所有默認(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()很有局限性,對(duì)有些命令不能直接把command line里的內(nèi)容當(dāng)作String參數(shù)傳給exec().

比如重定向等命令。

舉個(gè)例子

javap -l xxx > output.txt

這時(shí)要用到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*"});

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

    史上最佳springboot Locale 國(guó)際化方案

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

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

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

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

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

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

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

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

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

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

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

    SpringBoot淺析安全管理之高級(jí)配置

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

    Android中PreferenceFragment的使用詳解

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

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

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

最新評(píng)論