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