`
lll360360
  • 浏览: 11412 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

Java断点续传实现资源文件下载软件

阅读更多

一、断点续传原理<?XML:NAMESPACE PREFIX = O />

 

 

所谓断点续传,说的通俗一点就是要从文件已经下载的地方开始继续下载。

 

说的准确点,断点续传指的就是在下载或上传时,将下载或上传任务(一个文件)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障或人为因素导致程序终止后,下次还可以从已经上传或下载的部分开始继续上传下载未上传下载的部分,而没有必要重头开始上传下载。关键可以方便用户,节省时间,提高效率。

 

 

二、软件功能介绍

 

本软件使用Java Swing界面编程,多线程,序列化与反序列化等J2SE基础知识,其中断点续传的核心技术是Java对象的序列化和反序列化。

 

本软件的主要功能如下:

 

<!--[if !supportLists]-->1.    <!--[endif]-->新建任务

 

 

新建下载任务,填写url,线程数,保存路径点“确定”后主窗口中添加一个下载任务。

 

<!--[if !supportLists]-->2.    <!--[endif]-->任务开始

 

 

在等待下载的记录中选择一条记录点“任务开始”后被选择的记录开始下载

 

 

<!--[if !supportLists]-->3.    <!--[endif]-->任务暂停

 

 

在正在下载的记录中选择一天记录执行此功能,暂停记录的下载

 

 

<!--[if !supportLists]-->4.    <!--[endif]-->任务续传

 

 

一条记录暂停后如果需要重新下载可以选择“任务续传”功能,继续下载本条记录。

 

 

<!--[if !supportLists]-->5.    <!--[endif]-->任务取消

 

 

从下载任务中删除不符合条件的纪录。

 

 

<!--[if !supportLists]-->6.    <!--[endif]-->视图

 

 

在视图功能中可以显示和隐藏工具栏、状态栏

 

 

<!--[if !supportLists]-->7.    <!--[endif]-->帮助

 

 

帮助中显示软件的作者,联系方式等相关信息。

 

 

三、软件核心代码:

 

断点续传内核的实现主要用了8个类:

 

FileInfo.java        描述下载文件的详细信息,下载文件的网络地址 URL

 

FileTask.java        任务主线程,同时还描述任务的详细信息

 

MainFrame.java       下载界面

 

MyControl.java       工具类,放一些方法

 

MyListener.java      主要是一些事件操作

 

NewTask.java         新建任务界面

 

SplitFileTask.java   分任务线程

 

TestMain.java        最后还有一个测试类

 
1. FileInfo.java
,描述下载文件的详细信息

 

Java代码

001.package download;
002.  
003.   
004.  
005.import java.io.File;
006.  
007.import java.io.FileInputStream;
008.  
009.import java.io.FileNotFoundException;
010.  
011.import java.io.FileOutputStream;
012.  
013.import java.io.IOException;
014.  
015.import java.io.ObjectInputStream;
016.  
017.import java.io.ObjectOutputStream;
018.  
019.import java.io.Serializable;
020.  
021.import java.net.HttpURLConnection;
022.  
023.import java.net.MalformedURLException;
024.  
025.import java.net.URL;
026.  
027.import java.util.Calendar;
028.  
029.import java.util.concurrent.ExecutorService;
030.  
031.   
032.  
033.import javax.swing.JOptionPane;
034.  
035.import javax.swing.JTable;
036.  
037.   
038.  
039.@SuppressWarnings("serial")
040.  
041.public class FileTask implements Serializable, Runnable {
042.  
043.    private FileInfo fileInfo = null;// 任务文件信息
044.  
045.    private SplitFileTask[] splitTask = null;// 分任务数组
046.  
047.    private long fileLength;// 获得文件的长度
048.  
049.    private long[] startPos;// 分任务开始位置
050.  
051.    private long[] endPos;// 分任务结束位置
052.  
053.    private int countThread;// 分任务的数目
054.  
055.    private boolean isFirst = true; // 是否第一次取文件
056.  
057.    private boolean isStop = true; // 停止标志
058.  
059.    private File tempFile; // 文件下载的临时信息
060.  
061.    private ExecutorService executor = null;// 线程池
062.  
063.    private JTable viewTable = null;
064.  
065.    private int row = 0;// 任务编号
066.  
067.    private String speed = null;// 任务下载的速度
068.  
069.   
070.  
071.    public FileTask(FileInfo fileInfo, ExecutorService executor) {
072.  
073.       this.fileInfo = fileInfo;// 文件信息
074.  
075.       this.executor = executor;// 线程池
076.  
077.    }
078.  
079.   
080.  
081.    public void run() {
082.  
083.       if (fileInfo.isOver())// 入文件已下载完毕,则结束任务返回
084.  
085.           return;
086.  
087.       else
088.  
089.           isStop = false;// 否则,将isStop 置为false
090.  
091.   
092.  
093.       tempFile = new File(fileInfo.getFilePath() + File.separator
094.  
095.              + fileInfo.getFileName() + ".info");
096.  
097.       countThread = fileInfo.getConutThread();// 分任务的数目
098.  
099.   
100.  
101.       if (tempFile.exists()) {// 文件已存在,是续传文件
102.  
103.           isFirst = false;
104.  
105.           System.out.println("文件已存在,是续传文件" + tempFile);
106.  
107.           readFilePos();// 读取保存的下载信息(文件指针位置)
108.  
109.       } else {
110.  
111.           startPos = new long[countThread];
112.  
113.           endPos = new long[countThread];
114.  
115.           splitTask = new SplitFileTask[countThread];
116.  
117.           fileLength = getFileLong();// 获取文件的长度
118.  
119.           if (fileLength <= 0) {
120.  
121.              JOptionPane jp = new JOptionPane("网络资源不正确!");
122.  
123.              jp.createDialog("提示信息");
124.  
125.              return;
126.  
127.           }
128.  
129.           fileInfo.setStartDate(Calendar.getInstance());// 设置任务开始时间
130.  
131.           fileInfo.setFileLength(fileLength);// 设置文件的长度
132.  
133.       }
134.  
135.       long tem = fileLength / countThread;// 每个分任务的长度
136.  
137.       if (isFirst) {// 若是第一次
138.  
139.           for (int i = 0; i < countThread; i++) {
140.  
141.              startPos[i] = i * tem; // 分任务开始位置
142.  
143.           }
144.  
145.           for (int i = 0; i < countThread - 1; i++) {
146.  
147.              endPos[i] = startPos[i + 1]; // 分任务结束位置
148.  
149.           }
150.  
151.           endPos[countThread - 1] = fileLength;
152.  
153.           for (int i = 0; i < countThread; i++) {// 创建分任务
154.  
155.              /*
156.  
157.               * String path = fileInfo.getFilePath() + "//" +
158.  
159.               * fileInfo.getFileName() + ".temp";
160.  
161.               */
162.  
163.              String path = fileInfo.getFilePath() + "//"
164.  
165.                     + fileInfo.getFileName();
166.  
167.              splitTask[i] = new SplitFileTask(fileInfo.getSiteURL(), path,
168.  
169.                     i, startPos[i], endPos[i]);
170.  
171.           }
172.  
173.       }
174.  
175.   
176.  
177.       // 执行分任务
178.  
179.       for (int i = 0; i < countThread; i++) {
180.  
181.           // if(!splitTask[i].isOver())
182.  
183.           executor.execute(splitTask[i]);
184.  
185.       }
186.  
187.       long tempLength = testFileLength();// 测量文件已下载的长度
188.  
189.   
190.  
191.       boolean flag = true;
192.  
193.       // 等待子线程结束while循环
194.  
195.       while (!isStop) {
196.  
197.           speed = MyControl.speed(tempLength, testFileLength(), 0.5f);// 测量文件下载的速度
198.  
199.           tempLength = testFileLength();
200.  
201.           showViewTable();// ////刷新任务栏
202.  
203.           writeFilePos();
204.  
205.           if (flag) {
206.  
207.              fileInfo.setSpendTime(fileInfo.getSpendTime() + 1);
208.  
209.           }
210.  
211.           flag = !flag;
212.  
213.           MyControl.sleep(500);// 睡眠500毫秒
214.  
215.           int i = 0;
216.  
217.           for (; i < countThread; i++) {
218.  
219.              if (!splitTask[i].isStop()) {// 分任务没有结束
220.  
221.                  break;
margin-left: 1
分享到:
评论
15 楼 buyajun 2010-06-11  
又是 一 水贴
14 楼 hexl21 2010-03-31  
从别人那copy的吧
13 楼 TheNewBeginning 2010-03-31  
字体是小了点,但是用按住ctrl+滚轮 滚动可以调整字体的啊。
12 楼 yangdefeng95802 2010-03-30  
晕了,那有这样的,服了
11 楼 scorpiomiracle 2010-03-30  
lz,厚道点啊,这也叫“查看源代码”?
10 楼 qianlei007 2010-03-30  
眼睛呀! 不行了。。。
9 楼 liwenso 2010-03-30  
JE的问题吧,大家回复的字体也是相当的小!
8 楼 yzsunlight 2010-03-30  
楼主似乎没传完 希望LZ 共享
7 楼 deyami 2010-03-30  
看代码这东西应该还没做完吧?
6 楼 whaosoft 2010-03-30  
LZ 你赔我眼睛....
5 楼 zjshan 2010-03-30  
期待中、、、、、、
4 楼 xiaoyiz 2010-03-30  
看上去像是从哪里直接复制过来的~额的个神啊。。。
3 楼 luckylong221 2010-03-29  
这个字体看的很眼疼。。LZ能把整个文章改正一下么
2 楼 nothink 2010-03-29  
快点找上帝过来看啊。神才能看明白的格式
1 楼 soaring 2010-03-29  
这字体看着也太眼疼了……

相关推荐

    用Java实现断点续传.txt

    3. **保存已下载数据**:为了实现断点续传,需要将已下载的数据保存到本地文件系统中,并记录断点位置。 ```java RandomAccessFile oSavedFile = new RandomAccessFile("down.zip", "rw"); long nPos = 2000070; ...

    java断点续传

    以上就是Java断点续传的核心技术点。通过理解并实践这些概念,你可以开发出一个功能完善的文件断点续传系统,提高大文件下载的效率和用户体验。在实际项目中,可能还需要考虑如优化网络通信、提高并发性能以及如何在...

    spring boot实现大文件断点续传

    断点续传是一种文件传输技术,它允许用户在文件上传或下载过程中暂停,然后在稍后的时间从暂停的地方继续,而不是重新开始。这大大提高了用户体验,特别是对于大文件,如高清视频、大型软件安装包等。 Spring Boot...

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

    在Java FTP中,通过检查文件的大小和修改时间,可以确定是否已经部分下载,然后使用FTPClient的`restart`方法指定新的起始位置来实现断点续传。 多线程在Java FTP中常用于提高文件下载速度。通过创建多个线程,每个...

    java实现大文件上传分片上传断点续传.zip

    Java中实现断点续传需要记录每个分片的上传状态,通常存储在数据库或临时文件中,当再次上传时检查已上传的分片并跳过。 4. **SpringBoot框架**:SpringBoot简化了Spring应用的初始化和配置,提供了自动配置、内嵌...

    xuchuanftp_java_FTP断点续传_

    断点续传是一项非常实用的功能,它允许在上传或下载过程中中断后,从上次中断的位置继续,这对于大文件传输尤其重要,因为网络问题或服务器维护可能导致传输中断。 标题"XuChuanFTP_Java_FTP断点续传"可能是指一个...

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

    Java 实现HTTP断点续传是一项在网络编程中非常实用的技术,尤其在大文件下载时能够提高用户体验,因为用户可以中断下载并在稍后从上次中断的地方继续。以下将详细讲解断点续传的原理以及如何使用Java来实现。 断点...

    java断点续传的原理

    Java 断点续传的原理主要涉及到网络编程、文件处理以及多线程技术。断点续传是指在上传或下载大文件时,如果因为网络中断或其他原因导致传输不完整,可以从上次中断的地方继续传输,而不需要从头开始,极大地提高了...

    多线程断点续传工具类

    "多线程断点续传工具类"通常指的是一个Java类,该类设计用于实现文件传输时的多线程功能,并且能够从上次中断的地方继续下载或上传,这在大文件传输中非常有用,因为它可以提高速度并避免因网络问题导致的传输失败。...

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

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

    oss下载(断点续传,后台显示进度)源代码.rar

    2. **断点续传机制**:断点续传技术是通过保存已下载部分的信息,包括已下载的文件大小和文件的校验值,来实现的。在下载中断后,程序会根据这些信息找到上次的结束点,然后从该位置继续下载。在阿里云OSS SDK中,这...

    java大文件断点续传

    在本文中,我们将深入探讨如何在Java中实现大文件的断点续传。 一、原理介绍 断点续传的核心在于记录文件传输的状态,这通常包括已传输的字节数和文件的总大小。当文件传输因网络问题或其他原因中断时,系统可以...

    多线程下载支持断点续传

    在Java中,使用HttpURLConnection实现断点续传,首先需要读取本地已下载文件的大小,然后设置请求头的Range字段。当从服务器接收到206 Partial Content的响应码时,说明服务器支持断点续传,客户端可以继续下载未...

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

    ### Java 实现文件断点续传(HTTP)技术详解 #### 一、断点续传的基本原理 断点续传是一种在网络传输过程中,当传输中断后能够从中断处继续传输的技术。这种技术对于大文件的传输尤其有用,可以避免因为网络问题导致...

    用Java实现断点续传(HTTP)

    在IT行业中,断点续传是一项非常实用的技术,特别是在大文件传输时,它可以提高网络效率并减少因网络中断而造成的资源浪费。Java作为一款广泛使用的编程语言,也提供了实现断点续传的能力。本篇文章将深入探讨如何用...

    java实现FTP多线程断点续传

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

    java多线程断点续传下载

    Java多线程断点续传下载是一个复杂但实用的技术,尤其在处理大文件或网络不稳定时,能够提高用户体验并优化资源利用。以下是对这个主题的详细解析: **1. Java多线程** Java多线程是指在一个Java应用程序中同时执行...

    支持断点续传的下载进度对话框

    断点续传技术是现代网络下载中非常关键的一项功能,尤其在大文件传输时更为重要。这个技术允许用户中断下载后,在同一位置继续下载,而无需重新开始,从而节省了大量的时间和带宽资源。在安卓系统中,实现断点续传...

    java实现断点续传

    在Java编程环境中,实现断点续传是一项重要的技术,它允许用户在文件传输过程中中断,然后在稍后的时间点继续从中断的地方开始,而无需重新开始整个过程。这在处理大文件时尤其有用,因为网络问题或其他因素可能导致...

Global site tag (gtag.js) - Google Analytics