java执行命令行或者shell脚本,批处理的基本方法
By:Roy.LiuLast updated:2014-03-18
在项目中,有时候需要写一个项目的辅助工具类,这些工具少不了与shell 脚本或者命令行或者批处理文件打交道,用java 来统一这些工具,看起来像一个整体,总结了一下,一般有以下几种方式 :
1. 用 java 执行简单的命令并得到结果
2. 用java执行 复杂的cmd 或者 shell 命令
3. 用java执行外部批处理命令,这个比较特殊,很容易出错, 更复杂的处理
用 java 执行 cmd 命令或者 shell 脚本命令
这种方式通常使用于比较简单的命令方式,参数也不多也没有什么空格的类型,直接用一个简短字符串可以表达命令的内容。
用 java 执行比较复杂的命令行, 这种情况下命令行最好用数组表示, 不要直接拼字符串命令
比如下面的例子描述的如何通过命令行获取本机 CPU 的信息 。
注意到采用了多线程,一个收集正常的结果,一个处理错误的结果,另个缺一不可,否则会出问题。
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 执行批处理文件命令
这种处理方式与上面执行复杂的命令方式类似. 也必须采用两个线程去处理,当然你可以写一个线程类来调用,这样就无需写匿名线程类了。
From:一号门
Previous:为自己的网站用 java 生成二维码 的例子

COMMENTS