`
samttsch
  • 浏览: 63943 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JAVA断点续传简单实现

阅读更多
断点续传主要是使用http协议中range的属性来取得资源的部分内容,由于一般服务是不对外直接提供url访问的,一般都是通过id,在servlet中输出byte[]来实现,所以要想实现断点续传一般要自己实现一个服务端。

一个简单实现:
服务端:主要是分析了range属性,利用RandomAccessFile读取内容输出字节流
public class Download extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		int id = Integer.parseInt(req.getParameter("id"));
		String filename ;
		if (id == 1)
			filename = "E:/JDK_API_1_5_zh_CN.CHM";
		else if (id == 2)
			filename = "E;/JDK_API_1_6_zh_CN.CHM";
		else if (id == 3)
			filename = "E:/apache-tomcat-5.5.26/webapps/ROOT/tomcat.gif";
		else
			filename = "c.rar";

		RandomAccessFile raFile = new RandomAccessFile(filename, "r");
		
		String range = req.getHeader("RANGE");
		int start=0, end=0;
		if(null!=range && range.startsWith("bytes=")){
			String[] values =range.split("=")[1].split("-");
			start = Integer.parseInt(values[0]);
			end = Integer.parseInt(values[1]);
		}
		int requestSize=0;
		if(end!=0 && end > start){
			requestSize = end - start + 1;
			resp.addHeader("content-length", ""+(requestSize));
		} else {
			requestSize = Integer.MAX_VALUE;
		}
		
		byte[] buffer = new byte[4096];
		
		resp.setContentType("application/x-download");
		resp.addHeader("Content-Disposition", "attachment;filename=a.chm");
		ServletOutputStream os = resp.getOutputStream();
		
		int needSize = requestSize;
		
		raFile.seek(start);
		while(needSize > 0){
			int len = raFile.read(buffer);
			if(needSize < buffer.length){
				os.write(buffer,0,needSize);
			} else {
				os.write(buffer,0,len);
				if(len < buffer.length){
					break;
				}
			}
			needSize -= buffer.length;
		}
			
		raFile.close();
		os.close();
	}
}



客户端:分两次取得部分内容,输出到RandomAccessFile中
public static void main(String[] args) throws MalformedURLException, FileNotFoundException {
		test1(0,1000);
		test1(1001,0);
	}
	
	public static void test1(int start, int end) throws MalformedURLException, FileNotFoundException{
		
		String endpoint = "http://localhost:8080/Hello/download?id=1";
		
		RandomAccessFile raFile = new RandomAccessFile("E:/temp/test.chm", "rw");
		
		URL url = new URL(endpoint);
		try {
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			//conn.addRequestProperty("location", "/tomcat.gif");
			conn.setRequestProperty("Content-Type","text/html; charset=UTF-8"); 
			conn.setRequestProperty("RANGE","bytes="+start+"-"+end); 
			
			conn.connect();
			System.out.println(conn.getResponseCode());
			System.out.println(conn.getContentLength());
			System.out.println(conn.getContentType());
			
			InputStream ins = (InputStream)conn.getContent();
			
			raFile.seek(start);
			
			byte[] buffer = new byte[4096];
			int len = -1;
			while((len = ins.read(buffer))!=-1){
				raFile.write(buffer,0,len);
			}
			raFile.close();
			conn.disconnect();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


接下来的工作:实现客户端的并发,多线程,即多个下载任务同时进行,连接的复用,实现暂停,显示进度条,下载完成的事件处理等,不涉及具体业务,搭建整个架构。
分享到:
评论
1 楼 xujianjie12138 2015-09-18  
大赞!谢谢你!

相关推荐

    Java实现断点续传

    Java实现断点续传是一项在文件传输中非常实用的技术,特别是在大文件传输或者网络不稳定的情况下。断点续传允许用户在文件传输中断后从上次中断的位置继续,而不是重新开始整个传输过程,极大地提高了效率和用户体验...

    JAVA断点续传简单实现-改进2

    这个"JAVA断点续传简单实现-改进2"的主题可能是关于如何在Java中实现一个具有断点续传功能的文件下载工具的讨论。在实际应用中,这种功能允许用户在文件下载中断后,从上次停止的地方继续下载,而不是从头开始,极大...

    java断点续传源代码

    综上所述,Java断点续传技术涉及网络编程、文件操作和异常处理等多个方面,通过合理的实现可以显著提高大文件下载的效率和用户体验。理解并掌握这些知识点对于开发高效的文件下载应用至关重要。

    JAVA断点续传简单实现-改进1

    在本文中,我们将探讨如何在Java中实现一个简单的断点续传功能,并对其进行改进。 首先,我们需要理解断点续传的基本原理。断点续传主要依赖于两个关键点:一是保存当前传输的进度,二是根据进度信息来决定何时从...

    用Java 实现HTTP断点续传技术文档【附实例代码】

    以下是一个简单的示例代码框架,用于演示如何使用Java实现断点续传: ```java public class SiteFileFetch { public static void main(String[] args) { String urlStr = "http://www.example.com/down.zip"; ...

    基于c#的webapi断点续传几种方式及webclient断点续传下载.zip

    本资料包“基于C#的WebAPI断点续传几种方式及WebClient断点续传下载.zip”主要探讨了两种在C#环境下实现断点续传的方法:一是通过WebAPI实现服务端的断点续传功能,二是使用WebClient类进行客户端的断点续传下载。...

    java实现断点续传

    断点续传内核的实现 主要用了 6 个类,包括一个测试类。 SiteFileFetch.java 负责整个文件的抓取,控制内部线程 (FileSplitterFetch 类 )。 FileSplitterFetch.java 负责部分文件的抓取。 FileAccess.java 负责...

    JAVA实现HTTP断点续传[借鉴].pdf

    以下将详细讲解断点续传的原理以及如何使用Java来实现。 断点续传的原理主要依赖于HTTP协议的范围请求(Range Request)特性。当客户端希望从已下载的部分开始继续下载文件时,它会在HTTP请求头中添加一个`Range`...

    fastdfs断点续传代码

    在这里,我们将深入探讨如何使用FastDFS的Java客户端实现断点续传功能,主要关注`FileService.upload_file`方法。 首先,了解FastDFS的基本架构是必要的。FastDFS分为两个主要部分:跟踪服务器(Tracker Server)和...

    Java实现文件的断点续传(HTTP)

    通过以上的介绍可以看出,在Java中实现文件的断点续传相对较为简单,主要依靠HTTP协议的Range请求和Java自身的网络及文件I/O能力。开发者需要注意的是,除了技术实现外,还需要考虑异常处理和资源释放等细节问题,以...

    基于Java的的文件图片上传-分片上传-断点续传-秒传java源码.zip

    基于Java的的文件图片上传-分片上传-断点续传-秒传java源码.zip 1.主要功能经测试支持IE9以上,Chrome,FireFox;其他浏览器未测试; 2.文件上传部分:主要实现了文件的上传,进度条,多文件一起上传,上传前删除,...

    java中http断点续传的原理

    为了在Java中实现断点续传,我们需要掌握以下几个关键技术点: 1. **使用Java.net.HttpURLConnection发送带有RANGE字段的请求**:Java提供了丰富的网络编程API,其中`HttpURLConnection`类可以方便地构建HTTP请求并...

    基于vue+elementui实现断点续传、分片上传、秒传.zip

    分片上传(Chunked Uploads)是断点续传的一种实现方式,即将大文件分割成多个小块(也称为“片”或“段”),逐个上传。这样做的好处是能够降低单次上传的数据量,提高上传成功率,同时在服务器端可以并行处理这些...

    java实现ftp断点续传Java实用源码整理learns

    本文将深入探讨如何使用Java实现FTP断点续传,并提供相关的源码整理。 FTP断点续传的核心原理是通过FTP协议中的REST(Restart)命令来实现。REST命令告诉服务器从指定的位置开始继续传输数据,而不是重新开始。在...

    java断点续传

    总之,Java断点续传技术是一个涉及到网络通信、文件操作、多线程编程以及错误处理等多个领域的综合实践。通过理解和实现这个功能,开发者不仅能提升网络编程技能,还能更好地理解网络传输的底层机制。

    android文件下载(实现断点续传)

    在Android平台上,文件下载是一项常见的任务,特别是在处理大型文件或多媒体资源时,为了提升用户体验,开发者通常会采用多线程下载并实现断点续传功能。断点续传允许用户在下载过程中暂停、恢复,避免因网络问题或...

    利用Http协议实现断点续传.pdf

    使用Java实现断点续传 在Java中,可以通过`java.net.HttpURLConnection`类来实现基于HTTP协议的断点续传功能。以下是一个简单的示例: ```java import java.net.HttpURLConnection; import java.net.URL; public...

    java简版迅雷实现断点续 传源代码

    这个项目是基于Java语言实现的一个简易版的迅雷下载工具,它包含了断点续传功能,这意味着用户可以暂停下载并在任何时间继续,而无需从头开始。断点续传技术在大文件下载中非常有用,因为它提高了下载效率并减少了...

Global site tag (gtag.js) - Google Analytics