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

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

在项目中,有时候需要写一个项目的辅助工具类,这些工具少不了与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 执行批处理文件命令
这种处理方式与上面执行复杂的命令方式类似. 也必须采用两个线程去处理,当然你可以写一个线程类来调用,这样就无需写匿名线程类了。

上一篇: 为自己的网站用 java 生成二维码 的例子
下一篇: java 多线程并发设计模式之一: Future 模式应用
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号