多线程断点下载:顾名思义是用多线程实现的,断点是当第三方因素(断电、断网等)中断下载时,下次下载可以继续上次下载的地方下载。
1、通过getContentLength可以获取要下载文件的大小,这样可以在本机上创建一个相同大小的文件用来下载。
int fileLength = connection.getContentLength();
2、由于是多线程,所以要给每一个线程均分分配要下载的位置。
for(int i = 0; i < threadCount; i ++) { int startThread = i * blockSize; int endThread = (i + 1) * blockSize - 1; if( i == blockSize - 1) endThread = fileLength -1; new DownloadThread(i, startThread, endThread).start(); }
3、启动每个线程下载时,请求头需要Range参数,官网:www.fhadmin.org 值是bytes:xxx-xxx某事。比如"Range:0-10100",代表要下载的位置是从0到10100。
connection.setRequestProperty("Range", "bytes:"+startThred+"-" + endThread);
4、然后每次用RandomAccessFile写入数据到本机文件里。
while((length = inputStream.read(buffer)) != -1) { randomAccessFile.write(buffer, 0, length); }
5、当然每次下载时需要记录本线程下载了多少,以便断点时,下载的时候可以从下次下载的地方下载。
total += length; int currentThreadPostion = startThred + total; RandomAccessFile randomAccessFile2 = new RandomAccessFile(file, "rwd"); randomAccessFile2.write(String.valueOf(currentThreadPostion).getBytes()); randomAccessFile2.close();
官网:www.fhadmin.org 继承Thread类的DownloadThread类代码:
1 public static class DownloadThread extends Thread { 2 private int threadId; 3 private int endThread; 4 private int startThred; 5 public DownloadThread(int threadId, int startThred, int endThread) { 6 this.threadId = threadId; 7 this.startThred = startThred; 8 this.endThread = endThread; 9 } 10 public void run() { 11 //分段请求网络连接,分段保存在本地 官网:www.fhadmin.org 12 synchronized (DownloadThread.class) { 13 currentRunThreadCount += 1; 14 } 15 try { 16 System.err.println("理论线程:"+threadId+",开始位置:"+startThred+",结束位置:"+endThread); 17 URL url = new URL(path); 18 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 19 connection.setRequestMethod("GET"); 20 connection.setConnectTimeout(10 * 1000); 21 File file = new File(threadId+".txt"); 22 if(file.exists()) { //是否断点 23 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 24 String lastPostion_str = bufferedReader.readLine(); 25 startThred = Integer.parseInt(lastPostion_str); 26 bufferedReader.close(); 27 } 28 //设置分段下载的头信息 Range:做分段 29 connection.setRequestProperty("Range", "bytes:"+startThred+"-" + endThread); 30 int code = connection.getResponseCode(); 31 System.out.println(code); 32 if(code == 206) { //200:请求全部资源成功 206:代表部分资源请求成功 33 InputStream inputStream = connection.getInputStream(); 34 System.out.println(getFileName(path)); 35 RandomAccessFile randomAccessFile = new RandomAccessFile(new File(getFileName(path)), "rw"); 36 randomAccessFile.seek(startThred); 37 byte[] buffer = new byte[1024*10]; 38 int length = -1; 39 int total = 0;//记录下载的总量 40 System.err.println("实际线程:"+threadId+",开始位置:"+startThred+",结束位置:"+endThread); 41 while((length = inputStream.read(buffer)) != -1) { 42 randomAccessFile.write(buffer, 0, length); 43 total += length; 44 int currentThreadPostion = startThred + total; 45 RandomAccessFile randomAccessFile2 = new RandomAccessFile(file, "rwd"); 46 randomAccessFile2.write(String.valueOf(currentThreadPostion).getBytes()); 47 randomAccessFile2.close(); 48 } 49 randomAccessFile.close(); 50 inputStream.close(); 51 System.err.println("线程:"+threadId+"下载完毕"); 52 synchronized (DownloadThread.class) { 53 currentRunThreadCount -= 1; 54 if(currentRunThreadCount == 0){ 55 for(int i = 0; i < threadCount; i ++) { 56 File file2 = new File(i+".txt"); 57 file2.delete(); 58 } 59 } 60 } 61 } 62 63 } catch (Exception e) { 64 e.printStackTrace(); 65 } 66 67 68 super.run(); 69 } 70 }
完整代码:
1 package cn.starry.muchThreadDown; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.InputStream; 7 import java.io.InputStreamReader; 8 import java.io.RandomAccessFile; 9 import java.net.HttpURLConnection; 10 import java.net.MalformedURLException; 11 import java.net.URL; 12 import java.net.URLConnection; 13 14 import javax.swing.text.StyledEditorKit.BoldAction; 15 16 public class MuchThreadDown { 17 18 /** 19 * @param args 官网:www.fhadmin.org 20 */ 21 private static int threadCount = 3; 22 private static int blockSize; 23 private static String path = "http://192.168.0.112:8080/itheima74/feiq.exe"; 24 private static int currentRunThreadCount = 0; 25 public static void main(String[] args) { 26 27 try { 28 URL url = new URL(path); 29 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 30 connection.setRequestMethod("GET"); 31 connection.setConnectTimeout(10 * 1000); 32 int code = connection.getResponseCode(); 33 if(code == 200) { 34 int fileLength = connection.getContentLength(); 35 RandomAccessFile randomAccessFile = new RandomAccessFile(new File(getFileName(path)), "rw"); 36 randomAccessFile.setLength(fileLength); 37 blockSize = fileLength / threadCount; 38 for(int i = 0; i < threadCount; i ++) { 39 int startThread = i * blockSize; 40 int endThread = (i + 1) * blockSize - 1; 41 if( i == blockSize - 1) endThread = fileLength -1; 42 new DownloadThread(i, startThread, endThread).start(); 43 44 } 45 } 46 } catch (Exception e) { 47 e.printStackTrace(); 48 } 49 50 } 51 52 53 public static class DownloadThread extends Thread { 54 private int threadId; 55 private int endThread; 56 private int startThred; 57 public DownloadThread(int threadId, int startThred, int endThread) { 58 this.threadId = threadId; 59 this.startThred = startThred; 60 this.endThread = endThread; 61 } 62 public void run() { 63 synchronized (DownloadThread.class) { 64 currentRunThreadCount += 1; 65 } 66 //分段请求网络连接,分段保存在本地 67 try { 68 System.err.println("理论线程:"+threadId+",开始位置:"+startThred+",结束位置:"+endThread); 69 URL url = new URL(path); 70 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 71 connection.setRequestMethod("GET"); 72 connection.setConnectTimeout(10 * 1000); 73 File file = new File(threadId+".txt"); 74 if(file.exists()) { //是否断点 75 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 76 String lastPostion_str = bufferedReader.readLine(); 77 startThred = Integer.parseInt(lastPostion_str); 78 bufferedReader.close(); 79 } 80 //设置分段下载的头信息 Range:做分段 81 connection.setRequestProperty("Range", "bytes:"+startThred+"-" + endThread); 82 int code = connection.getResponseCode(); 83 System.out.println(code); 84 if(code == 206) { //200:请求全部资源成功 206:代表部分资源请求成功 85 InputStream inputStream = connection.getInputStream(); 86 System.out.println(getFileName(path)); 87 RandomAccessFile randomAccessFile = new RandomAccessFile(new File(getFileName(path)), "rw"); 88 randomAccessFile.seek(startThred); 89 byte[] buffer = new byte[1024*10]; 90 int length = -1; 91 int total = 0;//记录下载的总量 92 System.err.println("实际线程:"+threadId+",开始位置:"+startThred+",结束位置:"+endThread); 93 while((length = inputStream.read(buffer)) != -1) { 94 randomAccessFile.write(buffer, 0, length); 95 total += length; 96 int currentThreadPostion = startThred + total; 97 RandomAccessFile randomAccessFile2 = new RandomAccessFile(file, "rwd"); 98 randomAccessFile2.write(String.valueOf(currentThreadPostion).getBytes()); 99 randomAccessFile2.close(); 100 } 101 randomAccessFile.close(); 102 inputStream.close(); 103 System.err.println("线程:"+threadId+"下载完毕"); 104 synchronized (DownloadThread.class) { 105 currentRunThreadCount -= 1; 106 if(currentRunThreadCount == 0){ 107 for(int i = 0; i < threadCount; i ++) { 108 File file2 = new File(i+".txt"); 109 file2.delete(); 110 } 111 } 112 } 113 } 114 115 } catch (Exception e) { 116 e.printStackTrace(); 117 } 118 119 120 super.run(); 121 } 122 } 123 124 public static String getFileName(String path) { 125 return path.substring(path.lastIndexOf("/")+1); 126 } 127 128 }
相关推荐
在这个“Java多线程断点下载Sample”示例中,我们将深入探讨如何利用Java的多线程特性来实现文件的断点续传下载,并结合进度条展示下载进度。 首先,我们需要理解什么是多线程。在单线程环境中,程序的执行顺序是...
在Android开发中,为了提供更好的用户体验,我们常常需要实现文件的多线程断点下载功能。这不仅可以提高下载速度,还能允许用户在任何时候暂停或继续下载。本篇将重点讲解如何利用Retrofit库和GreenDao数据库来实现...
Java多线程断点下载文件是一种高效的文件下载方式,它允许在下载过程中暂停并从上次停止的地方继续,尤其适用于大...在实际应用中,上述知识点结合具体的代码实现,可以构建一个功能完善的Java多线程断点下载文件系统。
### Java实现FTP多线程断点续传:深入解析与技术要点 在现代软件开发中,数据传输是一项基本且关键的任务,特别是在处理大文件时,断点续传功能显得尤为重要。断点续传允许在网络连接中断后恢复传输,避免了重新...
实现Java多线程断点下载的步骤如下: 1. **检查已下载部分**:首先,我们需要读取本地已有的文件,获取其当前大小,这将作为断点续传的起点。 2. **创建线程池**:使用`ExecutorService`创建一个线程池,线程数量...
1. 把每个下载文件切成若干个块...2. HTTP Header里增加Range,如果服务器返回Cotent-Range 说明服务器支持文件定位,可以实现多线程下载 详细看这里 http://blog.csdn.net/maoxiang/archive/2010/04/02/5446293.aspx
而"多线程"和"断点"这两个文件名可能是指相关示例代码或文档,可以进一步帮助你理解和实践Java FTP的多线程下载和断点续传。 在实际应用中,还需要考虑其他因素,如错误处理、网络状况的监控、文件完整性检查等。...
通过以上步骤,我们可以构建一个功能完备的Java多线程断点续传下载程序。这个项目不仅可以帮助初学者理解多线程和网络编程的基本概念,也可以作为实际项目开发中的一个参考模板。对于想要深入研究Java网络编程和并发...
通过以上讲解,我们可以看到多线程断点下载技术在Java和Android平台上的实现涉及了网络编程、多线程同步、文件操作等多个方面的知识,它在提升用户体验的同时,也对开发者的技术要求较高。在实际应用中,开发者需要...
通过以上讲解,我们可以看到,Java多线程断点续传下载涉及了并发编程、文件I/O、网络通信等多个领域的知识,实现起来需要综合运用多种技术。在实际开发中,理解这些原理并灵活应用,可以构建出高效且用户体验良好的...
总结来说,Java中的多线程断点续传结合了并发处理和状态管理,通过分割文件并行处理,提高了文件传输效率,同时通过记录和恢复断点,实现了在网络不稳定情况下的可靠性。这是一项对大型文件上传和下载非常重要的技术...
Java多线程断点续传下载程序是一种高级的软件实现技术,它结合了Java的并发处理能力和文件传输的策略,以提高下载效率和用户体验。在这个项目中,我们主要关注两个核心概念:多线程和断点续传。 首先,多线程是Java...
Java多线程断点下载是一种高效且用户友好的文件下载技术,它允许用户在暂停下载后,下次继续从上次停止的地方开始下载,而无需重新开始整个文件的下载过程。以下是对这种技术的详细解释和实现关键点: 1. **获取...
java中多线程下载学习,又新增了断点的实现,可以实现暂停继续下载网络文件的功能
在这个特定的项目中,我们关注的是一个实现多线程断点续传功能的Java应用程序,它还具有用户界面来选择保存文件的目录,并显示下载进度条。这个程序的实现涉及到以下几个关键知识点: 1. **Socket编程**:Java中的...
java实现FTP多线程断点续传,上传下载! - java学习与交流 - j2ee学习网 - j2ee学习网 (2012年5月21日) 用 Java 实现断点续传 (HTTP) (2012年5月21日) Java写的支持断点续传的FTP--crybaby的博客 (2012年5月21日) ...
本篇文章详细介绍了Java多线程下载和断点续传的核心技术点及其实现方法。通过分析提供的代码示例,我们可以看到如何利用Java的多线程特性来提高文件下载的速度和稳定性。这种技术在实际应用中非常有用,特别是在处理...
以下是实现Java多线程断点下载的关键步骤: 1. **文件分块**:根据文件大小,将文件分成若干个等大小或不等大小的块。每个块对应一个下载线程。 2. **检查本地进度**:在开始下载前,检查本地是否已有部分文件。...
了解并实现多线程断点下载文件的原理和技术,不仅可以提升开发者的技能,也能帮助用户更高效地管理和下载大型文件,从而提高工作效率。在实际开发中,还需要考虑如何优化资源分配,防止过多线程对系统造成过大的压力...
Java网络编程多线程断点下载带界面选择文件夹进度条是一个高级的编程主题,它涉及到网络通信、多线程处理、文件I/O操作以及图形用户界面的设计。在这个项目中,我们将探讨以下几个关键知识点: 1. **网络编程基础**...