java实现下载器(以及创建一个URL对象)
1.思路讲解:
(1)注意路径:是网络路径噢
(2)创建创建网路协议对象(远程对象):HttpURLConnection urlConnection
(3)定位网络资源:URL url
(4)调用url的openConnection()方法,连接远程对象
(5)设置远程对象的参数和属性:例如 urlConnection.setRequestProperty("Range", "bytes=0-");
(6)发送连接请求,实现真正的连接:urlConnection.connect();
(7)通过返回码,判断是否连接成功(200以内是成功的)
(8)远程对象连接成功后,创建远程对象输入流
(9)开始读取与写入字节啦
2.代码:
package DownLoadDemo; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.util.RandomAccess; public class DownLoaderTest { private static final int MAX_SIZE_BUFF = 1024 * 1024 * 10; //1MB大小 //网络视频路径 private static String path = "https://www.iqiyi.com/v_uggavqs43w.html"; private static String writePath = "111.mp4"; public static void main(String[] args) throws IOException { //网络协议对象(远程对象) HttpURLConnection urlConnection = null; //定位网络资源 URL url = new URL(path); //调用url的openConnection()连接远程对象 urlConnection = (HttpURLConnection) url.openConnection(); //设置远程对象的参数和属性:"Range" : 范围," 0-":没有终止字节数,支持断点续传 urlConnection.setRequestProperty("Range", "bytes=0-"); //发送连接请求,实现真正的连接 urlConnection.connect(); //通过返回码,判断是否连接成功(200以内是成功的) int code = urlConnection.getResponseCode(); if(code / 100 != 2) { //请求失败 throw new RuntimeException("请求失败,返回码:" + code + "错误"); } //远程对象连接成功后,创建远程对象输入流 InputStream inputStream = urlConnection.getInputStream(); //创建bufferedInputStream // BufferedInputStream bInStream = new BufferedInputStream(inputStream); // //使用RandomAccess工具类 // RandomAccessFile randomAccess = new RandomAccessFile(path, "rw"); //创建缓冲字节数组buff byte[] buff = null; //开始读写 //1、添加(小技术)打印下载进度(下载的"每块字节"字节数/时间) //获取文件大小 int fileSize = urlConnection.getContentLength(); System.out.println(fileSize); int downloadedCount = 0; while(downloadedCount < fileSize) { //分块,处理一下最后剩余不足MAX_SIZE_BUFF量 if(fileSize - downloadedCount > MAX_SIZE_BUFF) { buff = new byte[MAX_SIZE_BUFF]; }else { buff = new byte[fileSize - downloadedCount]; } int currCount = 0; int read = -1; long startTime = System.currentTimeMillis(); // //读取 // bInStream.read(buff); while(currCount < buff.length) { read = inputStream.read(); if(read == -1) { break; } buff[currCount++] = (byte)read; } if(read == -1) { break; } long endTime = System.currentTimeMillis(); double speed = currCount / ((endTime - startTime) / 1000.0); //速度b/s System.out.println("读取速度:" + speed); downloadedCount += currCount; } } }
3.网络编程知识:
1.URL对象:
URL: 统一资源定位符
作用:
☆通过 URL 可以获得互联网资源相关信息,包括获得URL所引用的远程对象URLConnection,以及URL的输入流对象InputStream。
☆类 URL 是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
简单说,就是在网络上找到资源的位置(统一资源定位符),才可以通过网络的服务进行资源的各种操作:如存取、更新、替换和查找其属性。(得URL所引用的远程对象URLConnection,以及URL的输入流对象InputStream。)
2.创建一个URL对象步骤:
- 创建URL对象,并通过调用openConnection方法获得URLConnection对象;
- 设置URLConnection参数和普通请求属性;
- 向远程资源发送请求;
- 远程资源变为可用,程序可以访问远程资源的头字段和通过输入流来读取远程资源返回的信息。
3.连接后返回码含义:
参考自:
https://blog.csdn.net/iteye_17172/article/details/81929677 (Java URL对象的理解和例子 )
https://www.cnblogs.com/oubo/archive/2012/01/16/2394641.html (Java网络编程总结)