java执行shell并获取shell输出日志
获取shell输出日志需要java使用两个线程分别接受shell的标准输入流和错误流并打印出来
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; public class ShellLogRunTest { public static void main(String[] args) throws Exception, SecurityException { Process p = null; Runtime rt = Runtime.getRuntime(); String command = "cmd /c java -version"; command = "cmd /c ping 127.0.0.1 -n 3"; if (args != null && args.length > 0 && args[0] != null && args[0].trim().length() > 0) { command = args[0]; } try { p = rt.exec(command, null, null); // 获取进程的标准输入流 final InputStream is1 = p.getInputStream(); // 获取进城的错误流 final InputStream is2 = p.getErrorStream(); // 启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流 new Thread() { public void run() { BufferedReader br1 = new BufferedReader(new InputStreamReader(is1, Charset.forName("gb2312"))); // 这里要注意shell返回的类型,windows和linux可能不同 try { String line1 = null; while ((line1 = br1.readLine()) != null) { if (line1 != null) { System.out.println(line1); } } } catch (IOException e) { e.printStackTrace(); } finally { try { is1.close(); System.out.println("is1线程关闭"); } catch (IOException e) { e.printStackTrace(); } } } }.start(); new Thread() { public void run() { BufferedReader br2 = new BufferedReader(new InputStreamReader(is2, Charset.forName("gb2312"))); try { String line2 = null; while ((line2 = br2.readLine()) != null) { if (line2 != null) { System.out.println(line2); } } } catch (IOException e) { e.printStackTrace(); } finally { try { is2.close(); System.out.println("is2线程关闭"); } catch (IOException e) { e.printStackTrace(); } } } }.start(); p.waitFor(); p.destroy(); System.out.println("进程结束"); } catch (Exception e) { try { p.getErrorStream().close(); p.getInputStream().close(); p.getOutputStream().close(); } catch (Exception ee) { ee.printStackTrace(); } } } }