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作为一个网络连接的工具,推荐使用第一种写法