文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java使用Runtime执行系统命令遇到的问题

2024-04-02 19:55

关注

使用Runtime执行系统命令遇到的问题

java执行系统命令的工具,Runtime.getRuntime().exec(),这个工具里面的坑还是不少的,大部分网上已经分析了,我遇到一个没有在网上找到的。

首先说一下这个坑,在command中如果参数的内容中有空格、tab、换行符、回车符,就会执行失败,例如:grep "abc def" -r -n ./这是因为exec方法使用的是StringTokenizer对command分割的。

参数含义


    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可以自定义分割符,但是也有一个需要注意的地方

假如分隔符是“&&” 要执行的命令这样写 : grep &&"abc&&def"&&-r&&-n&&./ 执行也会报错,以为grep后面有个空格,它会把grep加空格当成一个整体作为一个命令执行,就会出现命令找不到,但是报的错误日志如果不注意很容易忽略这个空格,就只能一直苦恼。所以正确的方式就是把所有默认分隔符全都删掉,只用自己的分隔符就可以了。

下面是实现代码


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() 执行

比如重定向等命令。

举个例子


javap -l xxx > output.txt

这时要用到exec的第二种重载,即input 参数为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*"});

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯