`
zhoumeng87
  • 浏览: 70257 次
文章分类
社区版块
存档分类
最新评论

JAVA下实现多线程断点下载

阅读更多

多线程断点下载:顾名思义是用多线程实现的,断点是当第三方因素(断电、断网等)中断下载时,下次下载可以继续上次下载的地方下载。

 

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     }
View Code

完整代码:

技术分享
  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 }
View Code

 

JAVA下实现多线程断点下载

0
0
分享到:
评论

相关推荐

    Java多线程断点下载Sample

    在这个“Java多线程断点下载Sample”示例中,我们将深入探讨如何利用Java的多线程特性来实现文件的断点续传下载,并结合进度条展示下载进度。 首先,我们需要理解什么是多线程。在单线程环境中,程序的执行顺序是...

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

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

    Java 多线程断点下载文件

    Java多线程断点下载文件是一种高效的文件下载方式,它允许在下载过程中暂停并从上次停止的地方继续,尤其适用于大...在实际应用中,上述知识点结合具体的代码实现,可以构建一个功能完善的Java多线程断点下载文件系统。

    java实现FTP多线程断点续传

    ### Java实现FTP多线程断点续传:深入解析与技术要点 在现代软件开发中,数据传输是一项基本且关键的任务,特别是在处理大文件时,断点续传功能显得尤为重要。断点续传允许在网络连接中断后恢复传输,避免了重新...

    java多线程断点下载

    实现Java多线程断点下载的步骤如下: 1. **检查已下载部分**:首先,我们需要读取本地已有的文件,获取其当前大小,这将作为断点续传的起点。 2. **创建线程池**:使用`ExecutorService`创建一个线程池,线程数量...

    Java实现多线程下载和断点续传

    1. 把每个下载文件切成若干个块...2. HTTP Header里增加Range,如果服务器返回Cotent-Range 说明服务器支持文件定位,可以实现多线程下载 详细看这里 http://blog.csdn.net/maoxiang/archive/2010/04/02/5446293.aspx

    java ftp 多线程 断点续传等知识

    而"多线程"和"断点"这两个文件名可能是指相关示例代码或文档,可以进一步帮助你理解和实践Java FTP的多线程下载和断点续传。 在实际应用中,还需要考虑其他因素,如错误处理、网络状况的监控、文件完整性检查等。...

    java实现多线程断点续传下载

    通过以上步骤,我们可以构建一个功能完备的Java多线程断点续传下载程序。这个项目不仅可以帮助初学者理解多线程和网络编程的基本概念,也可以作为实际项目开发中的一个参考模板。对于想要深入研究Java网络编程和并发...

    多线程断点下载

    通过以上讲解,我们可以看到多线程断点下载技术在Java和Android平台上的实现涉及了网络编程、多线程同步、文件操作等多个方面的知识,它在提升用户体验的同时,也对开发者的技术要求较高。在实际应用中,开发者需要...

    java多线程断点续传下载

    通过以上讲解,我们可以看到,Java多线程断点续传下载涉及了并发编程、文件I/O、网络通信等多个领域的知识,实现起来需要综合运用多种技术。在实际开发中,理解这些原理并灵活应用,可以构建出高效且用户体验良好的...

    java 多线程断点续传

    总结来说,Java中的多线程断点续传结合了并发处理和状态管理,通过分割文件并行处理,提高了文件传输效率,同时通过记录和恢复断点,实现了在网络不稳定情况下的可靠性。这是一项对大型文件上传和下载非常重要的技术...

    JAVA多线程断点续传下载程序

    Java多线程断点续传下载程序是一种高级的软件实现技术,它结合了Java的并发处理能力和文件传输的策略,以提高下载效率和用户体验。在这个项目中,我们主要关注两个核心概念:多线程和断点续传。 首先,多线程是Java...

    Java多线程断点下载 带源码

    Java多线程断点下载是一种高效且用户友好的文件下载技术,它允许用户在暂停下载后,下次继续从上次停止的地方开始下载,而无需重新开始整个文件的下载过程。以下是对这种技术的详细解释和实现关键点: 1. **获取...

    多线程断点下载(java线程学习)

    java中多线程下载学习,又新增了断点的实现,可以实现暂停继续下载网络文件的功能

    Java网络编程多线程断点下载带界面选择文件夹进度条.zip

    在这个特定的项目中,我们关注的是一个实现多线程断点续传功能的Java应用程序,它还具有用户界面来选择保存文件的目录,并显示下载进度条。这个程序的实现涉及到以下几个关键知识点: 1. **Socket编程**:Java中的...

    自己收集的多个Java FTP断点续传的例子源码

    java实现FTP多线程断点续传,上传下载! - java学习与交流 - j2ee学习网 - j2ee学习网 (2012年5月21日) 用 Java 实现断点续传 (HTTP) (2012年5月21日) Java写的支持断点续传的FTP--crybaby的博客 (2012年5月21日) ...

    java 多线程下载和断点续传

    本篇文章详细介绍了Java多线程下载和断点续传的核心技术点及其实现方法。通过分析提供的代码示例,我们可以看到如何利用Java的多线程特性来提高文件下载的速度和稳定性。这种技术在实际应用中非常有用,特别是在处理...

    Java 多线程断点下载

    以下是实现Java多线程断点下载的关键步骤: 1. **文件分块**:根据文件大小,将文件分成若干个等大小或不等大小的块。每个块对应一个下载线程。 2. **检查本地进度**:在开始下载前,检查本地是否已有部分文件。...

    htp多线程断点下载文件

    了解并实现多线程断点下载文件的原理和技术,不仅可以提升开发者的技能,也能帮助用户更高效地管理和下载大型文件,从而提高工作效率。在实际开发中,还需要考虑如何优化资源分配,防止过多线程对系统造成过大的压力...

    Java网络编程多线程断点下载带界面选择文件夹进度条

    Java网络编程多线程断点下载带界面选择文件夹进度条是一个高级的编程主题,它涉及到网络通信、多线程处理、文件I/O操作以及图形用户界面的设计。在这个项目中,我们将探讨以下几个关键知识点: 1. **网络编程基础**...

Global site tag (gtag.js) - Google Analytics