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. 实战交付一套dubbo微服务到k8s集群(3)之二进制安装Maven

    maven官网:https://maven.apache.org/ maven二进制下载连接:https://archive.apache.org/dist/maven/maven-3/3.6.1/b ...

  2. DQL 数据查询语言

    查询数据(SELECT) # 查询所有数据 - 很危险,数据量过大,容易导致内存溢出而宕机 mysql> select * from student; # 先查询数据总量,然后决定是否可以查询所 ...

  3. java源码之集合类ArrayList

    1. ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部 ...

  4. App icons generator

    App icons generator https://appicon.co/ Drag or select an app icon image (1024x1024) to generate dif ...

  5. CSS 滚动条宽度 All In One

    CSS 滚动条宽度 All In One 滚动条宽度 IE 16px Chrome 12px scrollbar width bug 改变设计稿的宽度,没考虑到 scrollbar width sol ...

  6. mobile css & rem & em & px

    mobile css & rem & em & px 1 rem === 16px 任意浏览器的默认字体高都是 16px, 所有未经调整的浏览器都符合: 1em=16px, 那 ...

  7. PWA & bug

    PWA bug https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps https://learning.xgqfrms.x ...

  8. CORS OPTIONS

    CORS OPTIONS A CORS preflight request is a CORS request that checks to see if the CORS protocol is u ...

  9. nodejs 简单的模拟代理服务器

    https://nodejs.org/api/net.html#net_net_createconnection 代理前:client -> server 代理后:client -> pr ...

  10. 云原生系列5 容器化日志之EFK

    上图是EFK架构图,k8s环境下常见的日志采集方式. 日志需求 1 集中采集微服务的日志,可以根据请求id追踪到完整的日志: 2 统计请求接口的耗时,超出最长响应时间的,需要做报警,并针对性的进行调优 ...