断点续传主要是使用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();
}
}
接下来的工作:实现客户端的并发,多线程,即多个下载任务同时进行,连接的复用,实现暂停,显示进度条,下载完成的事件处理等,不涉及具体业务,搭建整个架构。
分享到:
相关推荐
Java实现断点续传是一项在文件传输中非常实用的技术,特别是在大文件传输或者网络不稳定的情况下。断点续传允许用户在文件传输中断后从上次中断的位置继续,而不是重新开始整个传输过程,极大地提高了效率和用户体验...
这个"JAVA断点续传简单实现-改进2"的主题可能是关于如何在Java中实现一个具有断点续传功能的文件下载工具的讨论。在实际应用中,这种功能允许用户在文件下载中断后,从上次停止的地方继续下载,而不是从头开始,极大...
综上所述,Java断点续传技术涉及网络编程、文件操作和异常处理等多个方面,通过合理的实现可以显著提高大文件下载的效率和用户体验。理解并掌握这些知识点对于开发高效的文件下载应用至关重要。
在本文中,我们将探讨如何在Java中实现一个简单的断点续传功能,并对其进行改进。 首先,我们需要理解断点续传的基本原理。断点续传主要依赖于两个关键点:一是保存当前传输的进度,二是根据进度信息来决定何时从...
以下是一个简单的示例代码框架,用于演示如何使用Java实现断点续传: ```java public class SiteFileFetch { public static void main(String[] args) { String urlStr = "http://www.example.com/down.zip"; ...
断点续传内核的实现 主要用了 6 个类,包括一个测试类。 SiteFileFetch.java 负责整个文件的抓取,控制内部线程 (FileSplitterFetch 类 )。 FileSplitterFetch.java 负责部分文件的抓取。 FileAccess.java 负责...
本资料包“基于C#的WebAPI断点续传几种方式及WebClient断点续传下载.zip”主要探讨了两种在C#环境下实现断点续传的方法:一是通过WebAPI实现服务端的断点续传功能,二是使用WebClient类进行客户端的断点续传下载。...
以下将详细讲解断点续传的原理以及如何使用Java来实现。 断点续传的原理主要依赖于HTTP协议的范围请求(Range Request)特性。当客户端希望从已下载的部分开始继续下载文件时,它会在HTTP请求头中添加一个`Range`...
在这里,我们将深入探讨如何使用FastDFS的Java客户端实现断点续传功能,主要关注`FileService.upload_file`方法。 首先,了解FastDFS的基本架构是必要的。FastDFS分为两个主要部分:跟踪服务器(Tracker Server)和...
通过以上的介绍可以看出,在Java中实现文件的断点续传相对较为简单,主要依靠HTTP协议的Range请求和Java自身的网络及文件I/O能力。开发者需要注意的是,除了技术实现外,还需要考虑异常处理和资源释放等细节问题,以...
基于Java的的文件图片上传-分片上传-断点续传-秒传java源码.zip 1.主要功能经测试支持IE9以上,Chrome,FireFox;其他浏览器未测试; 2.文件上传部分:主要实现了文件的上传,进度条,多文件一起上传,上传前删除,...
为了在Java中实现断点续传,我们需要掌握以下几个关键技术点: 1. **使用Java.net.HttpURLConnection发送带有RANGE字段的请求**:Java提供了丰富的网络编程API,其中`HttpURLConnection`类可以方便地构建HTTP请求并...
本文将深入探讨如何使用Java实现FTP断点续传,并提供相关的源码整理。 FTP断点续传的核心原理是通过FTP协议中的REST(Restart)命令来实现。REST命令告诉服务器从指定的位置开始继续传输数据,而不是重新开始。在...
分片上传(Chunked Uploads)是断点续传的一种实现方式,即将大文件分割成多个小块(也称为“片”或“段”),逐个上传。这样做的好处是能够降低单次上传的数据量,提高上传成功率,同时在服务器端可以并行处理这些...
总之,Java断点续传技术是一个涉及到网络通信、文件操作、多线程编程以及错误处理等多个领域的综合实践。通过理解和实现这个功能,开发者不仅能提升网络编程技能,还能更好地理解网络传输的底层机制。
在Android平台上,文件下载是一项常见的任务,特别是在处理大型文件或多媒体资源时,为了提升用户体验,开发者通常会采用多线程下载并实现断点续传功能。断点续传允许用户在下载过程中暂停、恢复,避免因网络问题或...
使用Java实现断点续传 在Java中,可以通过`java.net.HttpURLConnection`类来实现基于HTTP协议的断点续传功能。以下是一个简单的示例: ```java import java.net.HttpURLConnection; import java.net.URL; public...
这个项目是基于Java语言实现的一个简易版的迅雷下载工具,它包含了断点续传功能,这意味着用户可以暂停下载并在任何时间继续,而无需从头开始。断点续传技术在大文件下载中非常有用,因为它提高了下载效率并减少了...