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