Java Runtime.exec 执行shell命令

jopen 4年前

 最近做一个团购文件下载服务的时候,自己偷懒不想写文件下载的逻辑,而且Linux的curl 命令非常强大,于是乎想直接通过Java来执行curl命令做下载。

       在Java中,你可以通过Runtime.getRuntime().exec 来执行外部的shell命令。

    Process proc = Runtime.getRuntime().exec("ping www.baidu.com");                                        InputStream in = proc.getInputStream();                                        BufferedReader br = new BufferedReader(new InputStreamReader(in, "GBK"));                    String line = null;                                        while((line=br.readLine())!=null){                        System.out.println(line);                    }  

下面通过执行一个简单的 ping命令并打印其输出 作为示例。
    package com.ricky.java.sms;                import java.io.BufferedReader;        import java.io.ByteArrayOutputStream;        import java.io.IOException;        import java.io.InputStream;        import java.io.InputStreamReader;                public class RuntimeTest {                    public static void main(String[] args) {                        //      methodA();                                methodB();            }                    public static void methodB() {                                BufferedReader br = null;                try {                                        Process proc = Runtime.getRuntime().exec("ping www.baidu.com");                                        InputStream in = proc.getInputStream();                                        br = new BufferedReader(new InputStreamReader(in, "GBK"));                    String line = null;                                        while((line=br.readLine())!=null){                        System.out.println(line);                    }                                    } catch (IOException e) {                    e.printStackTrace();                }finally{                    if(br!=null){                        try {                            br.close();                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                }            }                    public static void methodA() {                                InputStream in = null;                try {                                        Process proc = Runtime.getRuntime().exec("ping www.baidu.com");                                        in = proc.getInputStream();                                        ByteArrayOutputStream baos = new ByteArrayOutputStream();                    in = proc.getInputStream();                            byte[] buf = new byte[1024];                    int len = 0;                    while ((len = in.read(buf, 0, 1024)) != -1) {                        baos.write(buf, 0, len);                    }                            byte[] arr = baos.toByteArray();                    String result = new String(arr, "GBK");                                        System.out.println("result="+result);                                    } catch (IOException e) {                    e.printStackTrace();                }finally{                    if(in!=null){                        try {                            in.close();                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                }            }                }  

打印的结果如下:



正在 Ping www.a.shifen.com [180.149.131.205] 具有 32 字节的数据:
来自 180.149.131.205 的回复: 字节=32 时间=1ms TTL=56
来自 180.149.131.205 的回复: 字节=32 时间=1ms TTL=56
来自 180.149.131.205 的回复: 字节=32 时间=1ms TTL=56
来自 180.149.131.205 的回复: 字节=32 时间=1ms TTL=56


180.149.131.205 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 1ms,最长 = 1ms,平均 = 1ms

来自:http://blog.csdn.net/top_code/article/details/43052399