`

断点下载

    博客分类:
  • HTTP
 
阅读更多

HttpURLConnection下载

 

1 正常下载

  下载数据,与获取服务器的响应正文没有什么不同,都是一些数据。但是,下载的文件可能不是文本,就不能在下载后在控制台打印出来了,而是应该创建一个文件,然后把获取到的响应数据保存到磁盘文件中。

 

// 创建URL对象,这个URL对应服务器上的一个AVI视频
		URL url = new URL("http://localhost/hello/resource/a.avi");
		// 获取连接对象
		HttpURLConnection httpCon = (HttpURLConnection)url.openConnection();
		// 设置请求方法为GET
		httpCon.setRequestMethod("GET");
		// 连接服务器
		httpCon.connect();
		
		// 获取服务器响应的状态码
		int code = httpCon.getResponseCode();
		// 如果响应成功
		if(code == 200) {
			// 获取连接的输入流对象
			InputStream in = new BufferedInputStream(httpCon.getInputStream());
			// 创建一个输出流对象,对应F:\\aa.avi文件,你应该知道,这会创建文件
			OutputStream out = new BufferedOutputStream(new FileOutputStream("F:\\aa.avi"));
			// 难道你不知道这是在干什么?
			byte[] buff = new byte[2048];
			int len;
			while((len = in.read(buff)) != -1) {
				out.write(buff, 0 , len);
			}
			out.close();
		}
		// 关闭连接
		httpCon.disconnect();

 

2 断点下载

什么叫断点下载?迅雷就可以断点下载!就是说下载了一半,然后把下载中断,明天打开电脑再继续下载。如果我在下载一个文件,先下载了50%,然后停止下载,然后再继续下载省下的50%。这里有两个问题需要我们处理:

需要告诉服务器,我要从资源的某个字节位置开始下载,而不是从头开始下载;

下载到的数据要追加到原来已下载文件的尾部,而不是创建新文件。

 

第二个问题我们应该知道怎么处理,我们在学习IO流时应该知道FileOutputStream类的构造器可以接受一人boolean类型的参数:

new FileOutputStream(a.txt, true);

这表示如果a.txt文件不存在,那么创建它;如果a.txt文件存在,那么就把写入到流中的数据追加到a.txt文件的尾部。

 

第一个问题是需要通过请求头信息来处理,有一个请求头叫range

httpCon.addRequestProperty(rangebytes=0-):表示从请求资源的0下标位置开始下载,直到资源结束;

httpCon.addRequestProperty(rangebytes=1024-):表示从请求资源的1024下标位置开始下载,直到资源结束;

httpCon.addRequestProperty(rangebytes=1024-2048):表示从请求资源的1024下标位置开始下载,直到资源的2048位置结束;

 

有了这个请求头,我们就可以通过请求头告诉服务器,从资源的哪个位置开始下载,而不是从头开始下载了。

但是,我们上一次下载了多少呢?我们需要告诉服务器从上一次下载的位置开始下载,但我们怎么知道上一次下载了多少呢?其实很简单就知道了,你下载的数据都写到目标文件中了,也就是那个还没有下载完的文件,一半的文件,你看看它的长度不就知道了么!

File file = new File(F:\\aa.avi);

long length = file.length();

 

  还有一个问题需要注意,当使用了range头信息之后,就算响应成功了,但是返回的状态码也不会是200,而不是206

 

第一步:获取连接对象,设置GET请求

 

URL url = new URL("http://localhost/hello/resource/a.avi");
HttpURLConnection httpCon = (HttpURLConnection)url.openConnection();
httpCon.setRequestMethod("GET");

 

 第二步:获取已下载字节数,设置range请求头,连接服务器。

 

 

 

 

// 已下载字节数。默认已下载的字节数为0
		long alreadySize = 0;
		// 获取磁盘上的文件,把服务器上下载来的数据写入这个文件中!
		File file = new File("F:\\b.avi");
		// 判断文件是否存在,如果存在,说明原来下载过,不过可能没有下载完
		if(file.exists()) {
			// 如果文件存在,那么已下载的字节数就是文件的长度
			alreadySize = file.length();
		}
		// 添加range请求头,表示从alreadySize开始下载,到最后结束
		httpCon.addRequestProperty("range", "bytes=" + alreadySize + "-");
		httpCon.connect();

 

 

 

第三步:获取响应状态码,判断是否响应成功,如果响应成功,那么获取未下载的字节数,以及整个资源的字节个数。

 

 

<!--EndFragment-->

 

<!--EndFragment-->

 

<!--EndFragment-->

// 获取响应状态码
		int code = httpCon.getResponseCode();
		// 如果响应成功,因为使用了range请求头,那么响应成功的状态码为206,而不是200
		if(code == 206) {
			// 获取未下载的部分
			// 本方法用来获取响应正文的大小,但因为设置了range请求头,那么这个方法返回的就是剩余的大小
			long unfinishedSize = httpCon.getContentLength();
			// 计算总大小!已完成+未完成=整个资源的大小
			long size = alreadySize + unfinishedSize;

 

第四步:获取连接的输入流对象,创建输出流对象,让输出流对象绑定F:\b.avi文件。注意,一定设置为追加数据!

 

// 获取连接的输入流对象
InputStream in = new BufferedInputStream(httpCon.getInputStream());

// 创建输出流对象,目标为file

OutputStream out = new BufferedOutputStream(new FileOutputStream(file, true));

<!--EndFragment-->

 

 

 

第五步:开始下载,在下载过程中显示已下载的百分比!

 

byte[] buff = new byte[2048];
			int len;
			while((len = in.read(buff)) != -1) {
				out.write(buff, 0 , len);
				// 把每次下载的字节累加到已下载大小中
				alreadySize += len;
				// 用已下载大小和整个资源大小来计算下载的百分比
				System.out.printf("%.2f%%\n", alreadySize * 1.0 / size * 100);
				Thread.sleep(2);
			}
			out.close();			
			System.out.println("成功了!");
		} else {
			System.out.println("下载失败!");
		}
		httpCon.disconnect();

 

 

 

尝试下载一段时间后把程序结束,然后再运行程序!看看最终下载完成后文件是否可以使用!

<!--EndFragment-->

<!--EndFragment--> 

 

<!--EndFragment-->
分享到:
评论

相关推荐

    c#实现断点下载

    在IT领域,断点下载是一种常见的网络下载技术,它允许用户在下载大文件时暂停、恢复,而无需从头开始。在本主题中,我们将详细探讨如何使用C#语言实现断点下载的功能。 首先,理解断点下载的核心原理至关重要。断点...

    Java 实现的断点下载

    Java 断点下载技术是Java编程中用于网络文件下载的一种高效方法,特别是在处理大文件时,它允许用户中断和恢复下载过程。断点下载的基本原理是通过保存已下载部分的信息,如下载的总长度、已下载的字节数以及当前...

    htp多线程断点下载文件

    "htp多线程断点下载文件"这一主题,涉及了网络编程、多线程技术和文件处理等多个知识点。 首先,HTTP(超文本传输协议)是我们浏览网页和下载文件的基础,它是应用层协议,负责客户端和服务器之间的通信。然而,...

    Android OkHttp断点下载

    在Android开发中,OkHttp和RxJava的结合可以实现高效的网络请求处理,其中包括断点下载功能。断点下载是指在用户暂停下载后,可以从上次停止的位置继续下载,避免了重新开始下载大文件的不便。本篇文章将深入探讨...

    FTP断点上传与断点下载

    在大型文件传输时,断点上传和断点下载功能显得尤为重要,因为它们允许用户在文件传输中断后从上次停止的位置继续,而无需重新开始整个过程,这大大提高了效率并节省了时间。 **断点上传** 断点上传是指在文件传输...

    网络下载断点下载加列表

    在IT行业中,网络下载是一项常见的任务,而"断点下载"和"列表"是这个领域中的两个关键概念。断点下载允许用户在中断后从上次停止的位置继续下载,极大地提高了下载效率,尤其是在处理大文件时。列表则通常用于组织和...

    Android文件断点下载

    在Android平台上,文件断点下载是一项重要的功能,尤其对于大文件的下载,它允许用户在任意时间暂停并恢复下载过程,而不会丢失已下载的数据。本文将深入探讨如何使用HttpURLConnection实现这一功能。 首先,理解...

    android通知栏,断点下载

    在Android系统中,通知栏是用户与应用交互的重要途径,特别是在后台运行任务或者进行长时间操作时,如断点下载。断点下载是指在一个文件下载过程中,如果因为网络问题或者其他原因中断,可以在下次重新开始下载时从...

    retrofit实现多线程断点下载,可暂停,开始

    在Android开发中,为了提供更好的用户体验,我们常常需要实现文件的多线程断点下载功能。这不仅可以提高下载速度,还能允许用户在任何时候暂停或继续下载。本篇将重点讲解如何利用Retrofit库和GreenDao数据库来实现...

    OKHttp多线程断点下载

    【OKHttp多线程断点下载】是一种在Android或Java应用中实现高效文件下载的方法,它结合了OKHttp网络库的优秀性能与多线程技术,以提高下载速度,并允许在下载过程中中断和恢复,避免因网络问题或其他因素导致的下载...

    多线程断点下载

    多线程断点下载是一种高效的网络数据下载技术,尤其在处理大文件时,它能显著提高下载速度并允许用户在中断后从上次停止的地方继续。这个技术在Java和Android平台上得到了广泛的应用。以下是对这一技术的详细解释: ...

    android多线程断点下载

    在Android开发中,多线程断点下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并确保下载的连续性。本文将详细介绍如何在Android中实现多线程断点下载,以及如何封装一个易于...

    swift-JLDownLoadManager一个断点下载工具封装自urlsession支持断点下载

    Swift中的JLDownLoadManager是一个基于URLSession的断点下载工具,专为iOS开发者设计,以简化文件的下载过程,并确保在下载过程中即使应用程序被关闭或设备重启,也能继续从上次中断的位置开始下载。这个库充分利用...

    多线程 断点续下以及非断点下载程序源码

    这里我们将深入探讨这两个知识点,以及如何将它们结合起来实现一个非断点下载程序。 首先,多线程(Multi-threading)是操作系统中并发执行任务的一种方式。在Java、C++或Python等编程语言中,开发者可以创建多个...

    Android多线程断点下载(优化)

    在Android开发中,多线程断点下载是一种常见的优化策略,尤其在处理大文件时,如应用程序、视频或音频文件的下载。这种技术允许用户在任何时间暂停下载,并在稍后从停止的地方继续,而无需重新开始。在本文中,我们...

    springMvc实现文件断点下载

    在这个特定的项目中,我们关注的是如何使用Spring MVC来实现文件的断点下载功能。断点下载是允许用户在中断下载后从上次停止的地方继续下载的技术,这对于大文件下载尤其有用,因为它可以提高用户体验并减少网络资源...

    Android断点下载示例

    在Android开发中,断点下载是一项非常实用的功能,它允许用户在任意时刻中断下载任务,之后可以从上次停止的地方继续下载,极大地提高了用户体验。本示例是专为Android初学者设计的,通过详细的代码注释,旨在帮助...

    iOS 开发中的视屏断点下载模板

    在iOS开发中,视频断点下载是一个常见的需求,特别是在用户需要下载大容量视频时,为了提高用户体验和节省网络资源,断点续传技术显得尤为重要。本文将深入探讨iOS开发中的视频断点下载模板,以及如何实现这一功能。...

    android 多线程文件断点下载

    在Android开发中,多线程文件断点下载是一项重要的技术,尤其对于大文件的下载,它能显著提高下载效率并提供更好的用户体验。断点下载允许用户在任何时间暂停下载,并在之后从停止的地方继续,而不会丢失已下载的...

    易语言HTTP断点下载

    在本主题“易语言HTTP断点下载”中,我们将深入探讨如何使用易语言实现HTTP协议的断点下载功能,以及如何结合进度条展示下载进度。 HTTP是互联网上应用最为广泛的一种网络协议,用于从Web服务器传输超文本到本地...

Global site tag (gtag.js) - Google Analytics