Java网络编程之下载图片

Java网络编程必知知识

  • TCP/IP协议的四层结构:1)物理层  2)网络层  3)传输层  4)应用层
  • ISO/OSI七层模型(开放系统互连参考模型)
  • HTTP协议是位于应用层的一个协议
  • DNS协议
  • URL统一资源定界符

以上三个协议过一段时间会写博客总结一下

Java实现基础的图片下载功能

private void core() {
	//HTTP(生态系统)
	//UrlConnection,apache	HttpClient,android	okhttp
	//模式
	try {
		URL u = new URL(url);
		
		String []string = url.split(".");
		System.out.println(string[1]);
		//String lastname = 
		
		//http是应用层的协议,基于TCP(传输层)套接字实现
		//TCP/IP:	1)物理层		2)网络层	3)传输层	4)应用层
		//ISO的OSI(开放系统互连参考模型)	7层	(理论概念)
		HttpURLConnection conn = (HttpURLConnection) u.openConnection();
		
		//写,发送数据
		//conn.getOutputStream();
		
//		conn.setDoInput(true);
//		conn.setDoOutput(true);
		
		//连接超时
		conn.setConnectTimeout(5000);
		
		//读取超时
		conn.setReadTimeout(10000);
		
		//读,接受数据(从本地的文件(磁盘))
		InputStream	in = conn.getInputStream();
		
		byte [] buf = new byte[1024*4];
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		int size;
		
		while(-1!=(size = in.read(buf))) {
			bout.write(buf,0,size);
		}
		
		//从网络获取数据
		byte[] data = bout.toByteArray();
		
		byte [] hash = MessageDigest.getInstance("SHA-256").digest(url.getBytes());
		String name = new BigInteger(1,hash).toString(16);
		
		FileOutputStream out = new FileOutputStream(name+".png");
		out.write(data);
		out.close();
		System.out.println("over");
		
	} catch (MalformedURLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (NoSuchAlgorithmException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

分析:

上面使用了java核心API实现图片下载功能:

首先通过创建一个URL对象-->使用u.openConnection打开连接-->使用getInputStream或getOutStream获得输入输出流,进行数据的传输,最后将输入流读到byteArrayOutputStream输出到内存,然后通过SHA-256安全散列算法得到URL的散列值,最后写出到文件即可.

 

OkHttp的介绍和使用

android网络框架之OKhttp ,一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来)
 
相比Apach的 HttpClient,OkHttp更加轻量级,便于使用,并且产生的较晚,使用了版本较新的java api,推荐大家使用OkHttp
 

OkHttp包的下载:

推荐使用Mavan直接下载:(我使用的是当前最新版3.12.1)

<dependency>
	<groupId>com.squareup.okhttp3</groupId>
	<artifactId>okhttp</artifactId>
	<version>3.12.1</version>
</dependency>

OkHttp的使用:

这里举一个例子,给出一个下载图片的方法:

public void download() {
	File path = new File("pic");
	if (!path.exists())
		path.mkdir();
	String name = String.format("%03d_%s.jpg", film.getId(), film.getTitle().split(" ")[0]);
	try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(path, name)));) {

		byte[] data = new OkHttpClient.Builder()
				.connectTimeout(60, TimeUnit.SECONDS)
				.readTimeout(60, TimeUnit.SECONDS)
				.writeTimeout(60, TimeUnit.SECONDS)
				.build()
				.newCall(new Request.Builder().url(film.getPath()).build()).execute().body().bytes();

		out.write(data);
		out.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

也可以将OkHttp这些分开来写:

OkHttpClient client = new OkHttpClient();
Response res = client.newCall(null).execute();
res.headers();
res.body();
res.body().bytes();
res.body().string();

  

注意:这里OkHttp作为一个网络连接的工具,推荐使用第一种写法

 

 

posted @ 2019-01-16 14:38  Bug研发工程师  阅读(388)  评论(0编辑  收藏  举报