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对象步骤:

  1. 创建URL对象,并通过调用openConnection方法获得URLConnection对象;
  2. 设置URLConnection参数和普通请求属性;
  3. 向远程资源发送请求;
  4. 远程资源变为可用,程序可以访问远程资源的头字段和通过输入流来读取远程资源返回的信息。

参考自:

https://blog.csdn.net/iteye_17172/article/details/81929677  (Java URL对象的理解和例子

https://www.cnblogs.com/oubo/archive/2012/01/16/2394641.html  (Java网络编程总结)

java实现下载器(以及创建一个URL对象)的更多相关文章

  1. Java中new一个子类对象的同时并不会自动创建一个父类对象

    首先重申一个概念:子类会继承父类所有非私有成员变量和方法,包括父类的构造方法 当创建一个子类对象时,首先开辟内存,然后调用类的构造函数,这里的构造函数由两部分组成,一部分是从父类继承而来的父类的构造方 ...

  2. Effictive Java学习笔记1:创建和销毁对象

    建议1:考虑用静态工厂方法代替构造器 理由:1)静态方法有名字啊,更容易懂和理解.构造方法重载容易让人混淆,并不是好主意 2)静态工厂方法可以不必每次调用时都创建一个新对象,而公共构造函数每次调用都会 ...

  3. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  4. php 中如何创建一个空对象

    // 创建一个空对象 $obj=(object)array(); //假设这是从数据库取内容 $arr=["prod_id"=>103,"prod_name&quo ...

  5. PHP中怎样创建一个空对象?

    如果没有声明一个对象然后就对其属性赋值会出现警告.那么我们给它创建一个空对象然后赋值就好了.PHP中创建一个空对象代码如下: 第一种方式: $empty_object = new stdClass() ...

  6. java 将Map拷贝到另一个Map对象当中

      java 将Map拷贝到另一个Map对象当中 CreateTime--2018年6月4日09点46分 Author:Marydon 1.需求说明 将一个MapA对象中所有的键值对完全拷贝到另一个M ...

  7. 创建一个doc对象时候 如果读取了一个已存在的xml对象时候 该xml对象的结构已存在doc中 当改变该doc结构时候 不需要创建新的doc对象

    创建一个doc对象时候 如果读取了一个已存在的xml对象时候 该xml对象的结构已存在doc中 当改变该doc结构时候不 需要创建新的doc对象 直接添加即可 他会同步过去

  8. 【转载】 C#中手动创建一个DataTable对象并写入数据

    在C#操作集合数据的过程中,有时候需要手动创建一个DataTable对象,并手动设置DataTable对象的Columns列名等信息,最后再往手动创建的DataTable对象中写入相应的数据信息,此时 ...

  9. 前端传递数据到后台的两种方式;创建一个map或者创建一个FormData对象

    一.构建一个map getAllDeptAllUsers(){ const modleCode = {'auditMenuId': this.auditMenuId, 'enterpriseId': ...

随机推荐

  1. Http和Https之为什么Https更安全

    [除夕了,加油干.希望自己新的一年万事顺意,祝大家身体健康,心想事成!] 我们都知道 HTTPS 安全,可是为什么安全呢? 看小电影还是浏览正常网站,一定要检查是不是 HTTPS 的,因为Https相 ...

  2. Kafka 博文索引

    博文索引 KafkaBroker 简析 KafkaConsumer 简析 KafkaProducer 简析 KafkaMirrorMaker 的不足以及一些改进 Kafka 简介 数据是系统的燃料,系 ...

  3. js & document.designMode

    js & document.designMode js 一键开启页面编辑模式 var mode = document.designMode; document.designMode = val ...

  4. js array contains All In One

    js array contains All In One includes & contains & has Array.prototype.contains "use st ...

  5. d3 & hexagon

    d3 & hexagon https://bl.ocks.org/mbostock/5249328 https://bl.ocks.org/vasturiano/e70e14483fe01eb ...

  6. classnames & React & taro

    classnames & React & taro classnames https://www.npmjs.com/package/classnames demo https://g ...

  7. HTML Imports & deprecated

    HTML Imports & deprecated https://caniuse.com/#search=html imports https://www.chromestatus.com/ ...

  8. Word带数学公式发布博客

    Word公式编辑器无法直接上传博客,一个一个的转换LaTeX还要加$,十分麻烦. 下面是我昨天摸索出来的办法.作为博客新人,这个问题困扰我一晚上,能解决我也是非常高兴的. 如果各位前辈有好方法的话,请 ...

  9. spring-ioc注解-理解2 零配置文件

    没有xml配置文件下的对象注入,使用到一个Teacher类,Config配置类,Test测试类. 1.Teacher类 import lombok.Data; import org.springfra ...

  10. 谈一下hashMap中put是如何实现的?

    源码: Hash(key):计算出key的hash值. put方法详解: 1.如果table数组为null或者table数组的长度为0,则调用resize()方法扩容并返回table数组.数组的长度为 ...