最近做一个团购文件下载服务的时候,自己偷懒不想写文件下载的逻辑,而且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