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. Automatic merge failed; fix conflicts and then commit the result.解决方法

    产生原因: git pull 的时候会分为两步,第一步先从远程服务器上拉下代码,第二步进行merge.当你merge时候失败了就会产生Automatic merge failed; fix confl ...

  2. C# 类(9) - 接口 Interface

    Interface 接口 类似 抽象类,也不能被实例化...(前面说的静态类,加上抽象类,还有这个,都3个了)接口其实比 抽象类 更加抽象.接口的方法(这个方法还不能有实体代码,和抽象类的抽象方法差不 ...

  3. HDU 3966 Aragorn's Story(树链剖分)题解

    题意:给一棵树,要求你对一个路径上的值进行加减,查询某个点的值 思路:重链剖分. 由于分了轻重儿子,我每次到重儿子的top只要O(1),经过的轻儿子最多logn条,那么我每次往上跳最多跳logn次. ...

  4. Vue & Sentry

    Vue & Sentry config.errorHandler https://cn.vuejs.org/v2/api/#errorHandler Vue.config.errorHandl ...

  5. Web 前端如何优雅的处理海量数据

    Web 前端如何优雅的处理海量数据 Q: 如何在 Web 页面上处理上亿条后端返回的数据,并且保证 UI 展示的流畅性 A: 思路: 时间分片, 批处理,Buffer 缓存,虚拟滚动,Web Work ...

  6. js & while & do while

    js & while & do while https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Stat ...

  7. lua windows上使用vs编译Lua

    video 下载lua源文件 还有种方法: 创建空项目,取名lua,导入lua源文件 将luac.c移除,然后编译lua.exe 将lua.c移除,添加luac.c然后编译lua.exe后重命名位lu ...

  8. 「NGK每日快讯」2021.1.8日NGK第66期官方快讯!

  9. 为什么NGK推出的DEFI项目这么火热?

    进入到2020年的下半年,DeFi的锁仓量基本上是以日破新高的态势,不断的成为一个独角兽.DeFi逐渐形成一个独角兽的同时,也在不断的给区块链生态赋能,源源不断进行金融价值输送.所以加密货币体量的不断 ...

  10. keepalived-1.3.5+MHA部署mysql集群

    MHA: MHA工作原理总结为以下几条: 从宕机崩溃的master保存二进制日志事件(binlog events): 识别含有最新更新的slave: 应用差异的中继日志(relay log)到其他sl ...