java执行命令行或者shell脚本,批处理的基本方法

在项目中,有时候需要写一个项目的辅助工具类,这些工具少不了与shell 脚本或者命令行或者批处理文件打交道,用java 来统一这些工具,看起来像一个整体,总结了一下,一般有以下几种方式 :
1.  用 java 执行简单的命令并得到结果
2.  用java执行 复杂的cmd 或者 shell 命令
3.  用java执行外部批处理命令,这个比较特殊,很容易出错, 更复杂的处理

用 java 执行 cmd 命令或者 shell 脚本命令
这种方式通常使用于比较简单的命令方式,参数也不多也没有什么空格的类型,直接用一个简短字符串可以表达命令的内容。
程序代码 程序代码

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ExecCommand {
    public static void main(String[] args) {
        ExecCommand obj = new ExecCommand();
        String domainName = "baidu.com";
        // in windows
        String command = "ping -n 3 " + domainName;        
        String output = obj.executeCommand(command);
        System.out.println(output);
    }

    private String executeCommand(String command) {
        StringBuffer output = new StringBuffer();
        Process p;
        try {
            p = Runtime.getRuntime().exec(command);
            p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    p.getInputStream()));

            String line = "";
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return output.toString();
    }
}


用 java 执行比较复杂的命令行, 这种情况下命令行最好用数组表示, 不要直接拼字符串命令
比如下面的例子描述的如何通过命令行获取本机 CPU 的信息 。
程序代码 程序代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ComplexCommand {    
    public static void main(String[] args) {        
    final StringBuffer stringBuffer = new StringBuffer();
    String[] cmd = new String[] { "cmd", "/c", "wmic cpu get name" };
    try {
        final Process process = Runtime.getRuntime().exec(cmd);

        new Thread(new Runnable() {
            public void run() {
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        stringBuffer.append(line);
                    }
                    reader.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }).start();
        new Thread(new Runnable() {
            public void run() {
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        stringBuffer.append(line);
                    }
                    reader.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }).start();
        process.getOutputStream().close();
        process.waitFor();
                if(process.exitValue() == 0){
            System.out.println("successfully execute command");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    String cpuinfo = stringBuffer.toString();
    cpuinfo = cpuinfo.substring(7);
    System.out.println(cpuinfo);    
    }
}

注意到采用了多线程,一个收集正常的结果,一个处理错误的结果,另个缺一不可,否则会出问题。

java 执行批处理文件命令
这种处理方式与上面执行复杂的命令方式类似. 也必须采用两个线程去处理,当然你可以写一个线程类来调用,这样就无需写匿名线程类了。


除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: java shell
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.