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

断点续传工具类

阅读更多
1 :DownloadTask类:
   
package com.youteach.util;
import java.io.File;
import java.net.URL;
import java.net.URLConnection;
import android.os.Message;
import android.util.Log;
public class DownloadTask extends Thread {
private int blockSize, downloadSizeMore;
private int threadNum = 5;
String urlStr, threadNo, fileName;
private int fileSize, downloadedSize;
private OnDownLoadCompetionListener listener;
/**
  * @param urlStr
  *            下载的URL
  * @param threadNum
  *            下载的线程数
  * @param fileName
  *            文件名
  */
public DownloadTask(String urlStr, int threadNum, String fileName,
   OnDownLoadCompetionListener listener) {
  this.urlStr = urlStr;
  this.threadNum = threadNum;
  this.fileName = fileName;
  this.listener = listener;
  Log.i("DownloadTask-->urlStr", urlStr + "");
  Log.i("DownloadTask-->fileName", fileName + "");
}
@Override
public void run() {
  FileDownloadThread[] fds = new FileDownloadThread[threadNum];
  try {
   URL url = new URL(urlStr);
   URLConnection conn = url.openConnection();
   // 获取下载文件的总大小
   fileSize = conn.getContentLength();
   // 计算每个线程要下载的数据量
   blockSize = fileSize / threadNum;
   // 解决整除后百分比计算误差
   downloadSizeMore = (fileSize % threadNum);
   File file = new File(fileName);
   for (int i = 0; i < threadNum; i++) {
    // 启动线程,分别下载自己需要下载的部分
    FileDownloadThread fdt = new FileDownloadThread(url, file, i
      * blockSize, (i + 1) * blockSize - 1);
    fdt.setName("Thread" + i);
    fdt.start();
    fds[i] = fdt;
   }
   boolean finished = false;
   while (!finished) {
    // 先把整除的余数搞定
    downloadedSize = downloadSizeMore;
    finished = true;
    for (int i = 0; i < fds.length; i++) {
     downloadedSize += fds[i].getDownloadSize();
     if (!fds[i].isFinished()) {
      finished = false;
     }
    }
    Log.i("DownloadTask-->downloadedSize", downloadedSize + "");
    Log.i("DownloadTask-->fileSize", fileSize + "");
    // 更新UI
    if (listener != null) {
     listener.onProgress(downloadedSize, fileSize);
    }
    // 休息1秒后再读取下载进度
    this.sleep(1000);
   }
   // 下载完成
   if (finished) {
    if (listener != null) {
     listener.onCompetion();
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
}
}

2  下载线程类:FileDownloadThread
package com.youteach.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
/**
* @author gongchaobin
*
*     android多线程下载
*  单个下载线程
*/
public class FileDownloadThread extends Thread{
    private static final int BUFFER_SIZE=1024;
    private URL url;
    private File file;
    private int startPosition;//当前线程下载的起点
    private int endPosition;//当前线程下载的终点
    private int curPosition;
    private boolean finished=false;    //用于标识当前线程是否下载完成
    private int downloadSize=0;
   
    public FileDownloadThread(URL url,File file,int startPosition,int endPosition){
        this.url=url;
        this.file=file;
        this.startPosition=startPosition;
        this.curPosition=startPosition;
        this.endPosition=endPosition;
    }
   
    @Override
    public void run() {
        BufferedInputStream bis = null;
        RandomAccessFile fos = null;                                              
        byte[] buf = new byte[BUFFER_SIZE];
        URLConnection con = null;
        try {
            con = url.openConnection();
            con.setAllowUserInteraction(true);
            //设置当前线程下载的起点,终点
            con.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition);
            //使用java中的RandomAccessFile 对文件进行随机读写操作
            fos = new RandomAccessFile(file, "rw");
            //设置开始写文件的位置
            fos.seek(startPosition);
            bis = new BufferedInputStream(con.getInputStream()); 
            //开始循环以流的形式读写文件
            while (curPosition < endPosition) {
                int len = bis.read(buf, 0, BUFFER_SIZE);               
                if (len == -1) {
                    break;
                }
                fos.write(buf, 0, len);
                curPosition = curPosition + len;
                if (curPosition > endPosition) {
                    downloadSize+=len - (curPosition - endPosition) + 1;
                } else {
                    downloadSize+=len;
                }
            }
            //下载完成设为true
            this.finished = true;
            bis.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean isFinished(){
        return finished;
    }

    public int getDownloadSize() {
        return downloadSize;
    }
}

3  接口:OnDownLoadCompetionListener
package com.youteach.util;
public interface OnDownLoadCompetionListener {
public void onProgress(int progress, int total);
public void onCompetion();
}

转自:http://user.qzone.qq.com/363669440/blog/1352163034#!app=2&via=QZ.HashRefresh&pos=1352163034
分享到:
评论

相关推荐

    多线程断点续传工具类

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

    Android断点续传工具类

    本篇将详细讲解如何构建一个Android断点续传工具类,以及相关的核心知识点。 1. **断点续传原理**: 断点续传主要依赖于服务器支持和客户端的存储。客户端在下载过程中记录已下载的文件大小,当再次启动下载时,向...

    局域网断点续传工具

    局域网断点续传工具是一种专为解决在局域网环境下进行大文件传输时遇到的问题而设计的应用软件。在不稳定的网络环境中,比如无线局域网,由于信号波动、网络中断等因素,大文件的复制过程可能会频繁中断,导致用户...

    java大文件分块上传断点续传demo

    本示例"java大文件分块上传断点续传demo"提供了一个完整的解决方案,它允许用户将大文件分块上传,并在上传过程中支持断点续传。 首先,理解"分块上传"的概念。分块上传是将一个大文件分割成多个小块,然后逐个上传...

    java断点续传

    Java断点续传技术在实际应用中广泛用于文件上传和下载工具,如迅雷、FTP客户端等,它有效地解决了大文件传输过程中的网络问题,提高了用户体验。了解并掌握这种技术对于开发高效的网络应用至关重要。

    Android 多线程可断点续传上传文件至服务器Demo

    Android 多线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)

    Android-单文件Http工具类支持GETPOST断点续传多线程断点续传

    本知识点主要聚焦于一个名为"HttpTools"的单文件工具类,它提供了对HTTP GET、POST方法的支持,并且具备断点续传和多线程断点续传的功能。这个工具类的实现,可以帮助开发者在处理大文件下载或上传时提高性能和用户...

    C#实现支持断点续传多线程下载客户端工具类

    在C#编程中,实现一个支持断点续传和多线程下载的HTTP Web客户端工具类是一项复杂但实用的任务。断点续传允许用户在下载过程中中断,然后在稍后的时间点继续下载,而不会丢失已下载的数据。多线程下载则能显著提高大...

    QT学习之文件传输和断点续传

    在这个"QT学习之文件传输和断点续传"的主题中,我们将深入探讨如何在QT环境中实现基于TCP的文件传输功能,并且特别关注断点续传技术。 首先,让我们了解TCP(Transmission Control Protocol)协议。TCP是一种面向...

    android断点续传

    Android SDK提供了一些工具类,如`DownloadManager`,可以方便地实现断点续传。`DownloadManager`是一个系统服务,可以管理多个下载任务,自动处理网络变化和设备重启等复杂情况。通过设置`Request`对象的`...

    fastdfs断点续传源码.rar

    《深入理解FastDFS断点续传机制》 在IT领域,文件存储系统是不可或缺的一部分,FastDFS作为一款轻量级的分布式文件系统,因其高效、稳定、易用的特点,被广泛应用在很多项目中。其中,断点续传功能是FastDFS在大...

    C# Winform 实现Http断点续传下载

    断点续传是一种非常实用的技术,尤其在处理大文件下载时,允许用户中断并重新启动下载,而无需从头开始。 首先,我们需要了解HTTP协议的基本概念。HTTP(超文本传输协议)是用于在Web上传输数据的标准协议。在下载...

    java大文件断点续传

    1. **Apache Commons IO库**:Apache Commons IO库提供了一些有用的工具类,例如`FileUtils`,可以帮助处理文件的读写和比较,这对于断点续传非常有用。 2. **NIO (New IO)**:Java的NIO提供了非阻塞的I/O操作,...

    http 断点续传演示

    服务器端收到这个请求后,如果支持断点续传,会在响应中返回`206 Partial Content`状态码,并在`Content-Range`响应头中包含完整的文件范围和当前传输的字节范围。例如,`Content-Range: bytes 5MB-10MB/20MB`表示总...

    断点续传的代码

    断点续传常用于下载工具(如迅雷、BitTorrent)和云存储服务(如百度网盘),提高大文件传输的效率和可靠性。在实际开发中,需要考虑错误处理、安全性和性能优化,例如检查文件一致性、防止数据损坏、减少网络延迟...

    IOS FTP 支持断点续传

    通过上述知识点的实现,`iPhoneFTP`项目为iOS开发者提供了一个实用的FTP客户端工具,特别是对于需要断点续传功能的应用,如大型文件下载或更新。开发者可以研究这个源代码,学习如何在自己的应用中集成这样的功能。

    下载码支持断点续传支持断点续传

    下载码和断点续传是网络下载领域中的关键技术,它们对于提高下载效率和用户体验具有重要意义。断点续传功能允许用户在下载过程中中断后,从上次停止的地方继续下载,而无需重新开始,这对于大文件下载尤其有用。下面...

    plupload断点续传

    在这个上下文中,这个类可能包含了处理Plupload上传过程中的一些逻辑,比如处理断点续传的状态和数据。 **moxie.js和plupload.js** 这两个JavaScript文件是Plupload的核心组件。`moxie.js`是前面提到的Moxie库,它...

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

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

    java实现FTP多线程断点续传

    Java中的`RandomAccessFile`类提供了一种方式,可以定位到文件中的任意位置,这对于实现断点续传非常有用。 4. **多线程传输**:为了提高传输效率,可以使用多个线程同时传输文件的不同部分。这需要将文件分割成多...

Global site tag (gtag.js) - Google Analytics