Java 调用系统命令 Runtime Process ProcessBuilder
2017-03-08 00:10
411 查看
Java 调用系统命令 Cmder
包括对waitFor()阻塞的处理
package southday.java.util; import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Arrays; import java.util.List; /** * 命令行工具 * @author southday * @date 2017年3月7日 */ public class Cmder { public Cmder() { super(); } private static class StreamReaderThread implements Runnable { InputStream ins = null; public StreamReaderThread(InputStream ins) { this.ins = ins; } @Override public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(ins)); try { String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } finally { FileUtil.closeSource(ins); FileUtil.closeSource(br); } } } /** * 执行系统命令 * @param cmd 完整命令,如:"tar -xvf sql_scripts.tar -C ." * @param directory 命令在指定目录下执行 * @return */ public static boolean exec(String cmd, String directory) { List<String> cmds = Arrays.asList(cmd.split("\\s+")); return exec(cmds, directory); } /** * 执行系统命令 * @param cmds 完整命令以空格分割得到List * @param directory 命令在指定目录下执行 * @return */ public static boolean exec(List<String> cmds, String directory) { printCurrentDIR(directory); printCmd(cmds); try { ProcessBuilder procBuilder = new ProcessBuilder(cmds); if (directory != null && directory.trim().length() > 1) { procBuilder.directory(new File(directory)); } procBuilder.redirectErrorStream(true); Process proc = procBuilder.start(); new Thread(new StreamReaderThread(proc.getInputStream())).start(); new Thread(new StreamReaderThread(proc.getErrorStream())).start(); proc.waitFor(); proc.destroy(); if (proc.exitValue() != 0) { return false; } } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 打印命令信息 * @param cmds */ public static void printCmd(List<String> cmds) { StringBuilder sb = new StringBuilder(); for (String s : cmds) { sb.append(s + " "); } System.out.println("[cmd] -> " + sb.toString()); } /** * 打印命令执行的当前目录 * @param directory */ private static void printCurrentDIR(String directory) { if (directory == null || directory.trim().length() < 1) { directory = System.getProperty("user.dir"); } System.out.println("[directory] -> " + directory); } }
相关文章推荐
- java Runtime.getRuntime().exec 调用系统脚本/命令注意事项
- java Runtime.getRuntime().exec 调用系统脚本/命令注意事项
- java的Runtime在windows系统下调用ping命令乱码
- java Runtime.getRuntime().exec 调用系统脚本/命令注意事项
- java之ProcessBuilder执行系统命令
- java Runtime.getRuntime().exec 调用系统脚本/命令注意事项
- Java运行系统命令并获取值(Process java.lang.Runtime.exec(String[] cmdarray, String[] envp, File dir)
- JAVA调用系统命令或可执行程序--返回一个Runtime运行时对象,然后启动另外一个进程来执行命令
- Java程序调用系统命令进行mysql数据库的备份与还原,windows下mysql备份
- Java基础知识之系统命令调用、序列化、JDO、匿名内部类
- Java:调用CMD命令打开文件或系统程序
- JAVA调用系统命令!!
- Java调用系统命令学习(3)
- java 中调用window系统中的文件,或者执行命令(shell、.CMD、.EXE)并获取返回值(如果有的话)
- 调用系统命令实现删除文件的操作,java调用系统命令实现删除文件的操作
- JAVA调用系统命令或可执行文件
- Java基础知识之系统命令调用、序列化、JDO、匿名内部类
- Java调用系统命令学习(三)
- Java调用系统命令学习(二)
- Java 使用Runtime.getRuntime.exec 和 ProcessBuilder 调用外部命令