您的位置:首页 > 理论基础 > 计算机网络

httpUrlConnection和httpClient的适用场合及详细例子

2016-12-01 17:20 537 查看
概念:http协议是现在internet上使用最多的协议,大部分java程序需要通过http协议来访问网络资源。

HttpURLConnection是官方的标准,这一点体现在安卓上特别明显,并且goole也优化过HttpURLConnection,并推荐使用它,从速度上讲HttpURLConnection直接在系统层面做了缓存策略处理,加快重复的请求速度,所以如果你是安卓开发的就尽量使用HttpURLConnection。而HttpClient是有Apache开发的,确实功能强,更容易控制细节开发更加丰富灵活的http程序,但是一般的java程序使用http协议时,由于HttpUrlConnection对大部分工作进行了包装,屏蔽了不需要的细节,更适合开发人员直接调用,还是推荐HttpURLConnection,但对于更多的细节控制如:代理、COOKIE、鉴权、压缩、连接池之类的操作肯定是HttpClient更加合适。

所谓存在即合理,两种方式都很好,在实际开发中可根据公司的框架和实际需求选择合理的方式。

下面是两种方法读取网络图片的例子(例子是我好久以前学习的时候引用别人博客做了一些修改,实在想不起来是谁的了,在此表示感谢),都有注释,大家体会下:

HttpURLConnection例子(不用另导jar包)

package cangku;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @说明 从网络获取图片到本地
* @author lightTrace
* @version 1.0
* @since
*/
public class httpurlconnection {
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String url = "http://ww2.sinaimg.cn/large/9d57a855jw1dqpv9fp4yuj.jpg";
byte[] btImg = getImageFromNetByUrl(url);
if(null != btImg && btImg.length > 0){
System.out.println("读取到:" + btImg.length + " 字节");
String fileName = "瞄httpurlconnection.jpg";
writeImageToDisk(btImg, fileName);
}else{
System.out.println("没有从该连接获得内容");
}
}
/**
* 将图片写入到磁盘
* @param img 图片数据流
* @param fileName 文件保存时的名称
*/
public static void writeImageToDisk(byte[] img, String fileName){
try {
File file = new File("C:\\" + fileName);
FileOutputStream fops = new FileOutputStream(file);
fops.write(img);
fops.flush();
fops.close();
System.out.println("图片已经写入到C盘");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据地址获得数据的字节流
* @param strUrl 网络连接地址
* @return
*/
public static byte[] getImageFromNetByUrl(String strUrl){
try {
URL url = new URL(strUrl);//创建url对象
HttpURLConnection conn = (HttpURLConnection)url.openConnection();//根据url对象创建HttpURLConnection的conn对象
conn.setRequestMethod("GET");//设置请求方式
InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
byte[] btImg = readInputStream(inStream);//得到图片的二进制数据
return btImg;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 从输入流中获取数据
* @param inStream 输入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];//一次读取1024个字节
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}


HttpClient例子(需导jar包,jar包下载地址:http://download.csdn.net/detail/u010182075/7145491

package cangku;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
/**
* @说明 从网络获取图片到本地
* @author lightTrace
* @version 1.0
* @since
*/
public class httpClient {
public static void main(St
4000
ring[] args) throws Exception {
//图片的网址
String url = "http://ww2.sinaimg.cn/large/9d57a855jw1dqpv9fp4yuj.jpg";
String destfilename = "D:\\喵httpclient.jpg";
//生成一个httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();

HttpGet httpget = new HttpGet(url);//设置请求方式
HttpResponse response = httpclient.execute(httpget);//设置http输出类型对象
HttpEntity entity = response.getEntity();//创建一个实体对象,实体对象可以是流也可以是字符串
InputStream in = entity.getContent();//创建实体内容的输入流对象
File file = new File(destfilename);//保存文件的路劲
try {
FileOutputStream fout = new FileOutputStream(file);//创建输出流对象
int l = -1;
byte[] tmp = new byte[1024];//一次读取1024个字节
while ((l = in.read(tmp)) != -1) {
fout.write(tmp,0,l);//将输入的流一次读取1024个字节读出到指定文件路劲
//注意这里如果用OutputStream.write(buff)的话,图片会失真,大家可以试试
}
fout.flush();
fout.close();
} finally {
// 关闭低层流。
in.close();
}
httpclient.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  http协议