最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • springboot集成activemq的實(shí)例代碼

    springboot集成activemq的實(shí)例代碼

    本篇文章主要介紹了springboot集成activemq的實(shí)例代碼,詳細(xì)的介紹了ActiveMQ和Spring-Boot 集成 ActiveMQ,有興趣的可以了解下。
    2017-05-05
  • 詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換

    詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換

    這篇文章主要介紹了詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java8中的Lambda表達(dá)式理解與使用示例詳解

    Java8中的Lambda表達(dá)式理解與使用示例詳解

    Lambda表達(dá)式是Java8引入的一種簡(jiǎn)潔寫(xiě)法,用于實(shí)現(xiàn)函數(shù)式接口,可以簡(jiǎn)化匿名函數(shù)的代碼,本文給大家介紹Java8中的Lambda表達(dá)式理解與使用示例,感興趣的朋友一起看看吧
    2024-11-11
  • spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南

    spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南

    ActiveMQ是一種開(kāi)源的基于JMS規(guī)范的一種消息中間件的實(shí)現(xiàn),ActiveMQ的設(shè)計(jì)目標(biāo)是提供標(biāo)準(zhǔn)的,面向消息的,能夠跨越多語(yǔ)言和多系統(tǒng)的應(yīng)用集成消息通信中間件,這篇文章主要給大家介紹了關(guān)于spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java 實(shí)現(xiàn)聲音播放程序

    Java 實(shí)現(xiàn)聲音播放程序

    這篇文章主要介紹了Java 實(shí)現(xiàn)聲音播放程序的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 詳解Java中跳躍表的原理和實(shí)現(xiàn)

    詳解Java中跳躍表的原理和實(shí)現(xiàn)

    跳躍表(Skip list)是有序鏈表的擴(kuò)展,簡(jiǎn)稱(chēng)跳表,它在原有的有序鏈表上增加了多級(jí)索引,通過(guò)索引來(lái)實(shí)現(xiàn)快速查找,實(shí)質(zhì)上是一種可以進(jìn)行二分查找的有序鏈表。本文主要為大家介紹了跳躍表的原理和實(shí)現(xiàn),需要的可以參考一下
    2022-12-12
  • Spring中@Autowired、@Qualifier、@Resource注解的區(qū)別

    Spring中@Autowired、@Qualifier、@Resource注解的區(qū)別

    這篇文章主要介紹了Spring中@Autowired、@Qualifier、@Resource注解的區(qū)別,@Autowired 可以單獨(dú)使用,如果單獨(dú)使用,它將按類(lèi)型裝配,因此,如果在容器中聲明了多個(gè)相同類(lèi)型的bean,則會(huì)出現(xiàn)問(wèn)題,因?yàn)?nbsp;@Autowired 不知道要使用哪個(gè)bean來(lái)注入,需要的朋友可以參考下
    2023-11-11
  • Spring?Cloud?OpenFeign實(shí)例介紹使用方法

    Spring?Cloud?OpenFeign實(shí)例介紹使用方法

    Spring?Cloud?OpenFeign?對(duì)?Feign?進(jìn)行了二次封裝,使得在?Spring?Cloud?中使用?Feign?的時(shí)候,可以做到使用?HTTP?請(qǐng)求訪問(wèn)遠(yuǎn)程服務(wù),就像調(diào)用本地方法一樣的,開(kāi)發(fā)者完全感知不到這是在調(diào)用遠(yuǎn)程訪問(wèn),更感知不到在訪問(wèn)?HTTP?請(qǐng)求
    2022-09-09
  • java實(shí)現(xiàn)http請(qǐng)求工具類(lèi)示例

    java實(shí)現(xiàn)http請(qǐng)求工具類(lèi)示例

    這篇文章主要介紹了java實(shí)現(xiàn)http請(qǐng)求工具類(lèi)示例,需要的朋友可以參考下
    2014-05-05
  • 使用SpringBoot獲取所有接口的路由

    使用SpringBoot獲取所有接口的路由

    這篇文章主要介紹了使用SpringBoot獲取所有接口的路由方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

镇康县| 聊城市| 阿巴嘎旗| 上饶市| 芦山县| 神农架林区| 中卫市| 苍山县| 宁晋县| 乐平市| 辉南县| 卢氏县| 井研县| 琼结县| 牙克石市| 财经| 光山县| 红安县| 什邡市| 新邵县| 中方县| 太湖县| 松桃| 陵水| 宜宾市| 赣州市| 邳州市| 叙永县| 大同市| 若尔盖县| 巨野县| 兴安盟| 叙永县| 新余市| 吉木乃县| 麦盖提县| 五华县| 勐海县| 太和县| 定结县| 华安县|