以多线程、断点续传方式下载文件,经常出现下载下来的文件大小和服务端一致,但是却无法正常打开的现象,搞了很久,贴下我的实现方式,请各位多多指教
思路:
1、将下载文件的处理放在自定义的线程类中,每下载一个文件就新启动一个下载线程。
2、在下载线程中完成对服务端的链接和身份认证,成功后开始下载文件。
3、新建n个子线程,根据下载文件的大小和线程数量得到每个子线程要下载的大小。
4、分别启动子线程,进行分段下载。
5、分段下载完成,合并临时文件。
6、合并文件完成,删除临时文件。
实现:
FTP下载线程类
package com.jfc.ftp.tools;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import com.jfc.ftp.service.FTPService;
import com.jfc.ftp.util.Constant;
import com.jfc.ftp.util.PropertyUtil;
/**
* 为断点续传下载文件而启动新的线程
* @author SavageGarden
*
*/
public class FTPThread extends Thread{
/**
* 站点URL
*/
private String host;
/**
* 站点端口
*/
private int port;
/**
* 用户
*/
private String user;
/**
* 密码
*/
private String pswd;
/**
* 当前线程的FTP操作接口实现类
*/
private FTPService ftpService;
/**
* 第几个下载项
*/
private int rowIndex;
/**
* 要下载的文件路径
*/
private String filepath;
/**
* 要下载的文件大小
*/
private long filesize;
/**
* 要下载的文件保存路径
*/
private String savepath;
/**
* 标记文件已下载量
*/
public int hadRead = 0;
/**
* 下载线程开始时间
*/
public long startTime = 0;
/**
* 下载线程结束时间
*/
public long endTime = 0;
/**
* 当前下载线程的互斥锁
*/
public Lock ftpThreadLock;
/**
* 当前下载线程的状态
*/
private int status = Constant.THREAD_STATUS_NEW;
public synchronized int getStatus() {
return status;
}
public synchronized void setStatus(int status) {
this.status = status;
}
/**
* 是否已经合并文件
*/
private boolean hadMerger = false;
public synchronized boolean isHadMerger() {
return hadMerger;
}
public synchronized void setHadMerger(boolean hadMerger) {
t