`

java实现断点续传

阅读更多
/**        
 * @{#} MainThreadDownFile.java   
 * Create on 2009-6-17 下午11:00:14     
 *     
 * @author 何明     
 * @version 1.0   
 *  
 * Copyright (c) 2007 by GTT.        
 */  
  
package com.down;   
  
import java.io.File;   
  
import com.common.Common;   
import com.common.ExceptionManager;   
  
  
public class MainThreadDownFile{   
       
    private String url;   
    private String localsavePath;   
    private String localsaveName;   
    private int threadNum;   
    private static String tempStoreDirectory;//临时文件路径   
    private long eachThreadSzie;//平均每个线程获取文件的大小   
    boolean isDownStop=false;   
    private int entid;   
       
    public MainThreadDownFile(int entid,String url,String savePath,String saveName,int threadNum) {   
        this.entid=entid;   
        this.url=url;   
        this.localsavePath=savePath;   
        this.localsaveName=saveName;   
        this.threadNum=threadNum;   
        if(!createDirectory(localsavePath)){   //创建存放附件的地址   
            Common.WriteLog("创建文件失败!");   
            return;   
        }   
    }   
       
    /**创建存放临时文件的临时文件夹*/  
    private String getTempStoreDirectory(String tempDirctoryName){   
        String tempDirctory = localsavePath +"\\"+ tempDirctoryName;   
        String tNum = "";   
        do{   
            tempDirctory = tempDirctory + tNum;   
            File file = new File(tempDirctory);   
            if(file.exists()) tNum = "0";   
            else return tempDirctory;   
        } while(true);   
    }   
       
    /**判断是否有存放附件文件夹,如果没有就创建*/  
    private boolean createDirectory(String localFileAddress){   
        try{   
            File file = new File(localFileAddress);   
            if(!file.exists())   
                file.mkdir();   
        }catch(Exception e){   
            e.printStackTrace();   
            return false;   
        }      
        return true;   
    }   
       
    public void getEachThreadFileSize(long size){   
        eachThreadSzie=size/threadNum;   
    }   
       
    public boolean checkExistTPFile(){   
        File file = new File(tempStoreDirectory);   
        String fileList[] = file.list();   
        if(fileList.length > 0){   
            for(int i = 0; i < fileList.length; i++)   
                if(fileList[i].indexOf(".tp") > 0)   
                    return true;   
        }    
        return false;   
    }   
       
    public void init(NetManager nm) throws ExceptionManager{           
        try{   
            if(nm.getCode()==200){   
                String tempDirctoryName="tmp";   
                DownInfoWriteXml diwx=new DownInfoWriteXml(localsavePath);   
                String localSaveAddress=diwx.downFileExist(url);     //获取临时附件地址   
                if(localSaveAddress!=null){   
                    this.tempStoreDirectory=localSaveAddress;              
                }else{   
                    synchronized(this){   
                        tempStoreDirectory=getTempStoreDirectory(tempDirctoryName);   
                        createDirectory(tempStoreDirectory);   
                        diwx.addOneDownRecord(url, tempStoreDirectory);   
                        diwx.saveChange();   
                    }   
                }   
                   
                long filesize=nm.getFileSize();   
                String filename=Common.getSuffixName(nm.getUrlFileName(),"/");   
                String tempThreadfileName=tempStoreDirectory + "\\" + filename + ".part";   
                getEachThreadFileSize(filesize);   
                   
                SingleThreadDownFile[] stdf=new SingleThreadDownFile[threadNum];   
                long startPos=0L,endPos=0L;   
                for(int i=1;i<=threadNum;i++){   
                    if(i>1) startPos+=eachThreadSzie;   
                    endPos=startPos+eachThreadSzie;   
                    DownInfo di=new DownInfo(i,url,startPos,endPos);   
                    stdf[i-1]=new SingleThreadDownFile(tempThreadfileName+i);   
                    stdf[i-1].setDi(di);   
                    stdf[i-1].start();   
                }   
                   
                String str[]=new String[threadNum];   
                boolean isStop=true;   
                DownState ds=new DownState(filesize);   
                while(isStop){                     
                    int n=0;   
                    long fsize=0L;   
                    long totalsize=0L;   
                    for(int i=1;i<=threadNum;i++){   
                        if(stdf[i-1].isAlive())   
                            fsize += stdf[i-1].downPace;   
                        else n++;   
                        long tsize=new Long(stdf[i-1].downSize);   
                        if(tsize==0){   
                            totalsize += Common.FileSize(tempThreadfileName+i);   
                        }else{   
                            totalsize += tsize;   
                        }   
                    }   
                    if(n==threadNum) isStop=false;   
                    ds.updateDownSize(fsize,totalsize);   
                    ds.init(isStop);   
                }   
                if(!checkExistTPFile()&&!isStop){   
                    FileCombination fc=new FileCombination(url,tempStoreDirectory,localsavePath,localsaveName);   
                    fc.init();   
                    isDownStop=true;   
                }   
            }else{   
                Common.WriteLog(nm.getHttpMessage(nm.getCode()));   
            }   
        }catch(Exception e){   
            throw new ExceptionManager(entid,"出现异常",e);   
        }   
    }   
}  

分享到:
评论

相关推荐

    Java实现断点续传

    Java实现断点续传是一项在文件传输中非常实用的技术,特别是在大文件传输或者网络不稳定的情况下。断点续传允许用户在文件传输中断后从上次中断的位置继续,而不是重新开始整个传输过程,极大地提高了效率和用户体验...

    用Java实现断点续传.txt

    ### 用Java实现断点续传的技术解析 #### 一、技术原理概述 断点续传是一种在网络连接不稳定或在下载过程中出现意外中断时能够继续完成下载的技术。它通过记录下载过程中断时的位置,当重新启动下载任务时,可以从...

    Java实现断点续传程序

    Java实现断点续传程序是一项在文件传输领域中常见的技术,尤其在大文件下载或上传时,能够提高效率并提供良好的用户体验。以下是关于这个主题的详细讲解。 **断点续传的原理** 断点续传的基本思想是允许用户在文件...

    用Java实现断点续传

    【Java实现断点续传的关键几点】 1. **文件分块**:将大文件分成若干个小块进行传输,这样可以根据每块的完成情况来决定是否需要重新下载。 2. **状态记录**:在下载过程中,记录下每个文件块的下载进度,包括已...

    用 Java 实现断点续传 (HTTP)

    ### Java实现断点续传的关键几点 1. 客户端在发送请求时设置Range头,指定需要下载的文件的起始字节位置。 2. 服务器端需要检查请求头中的Range字段,确定要返回的文件范围,并在响应头中设置Content-Range字段。 3...

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

    用apache的FTP实现断点续传 - janestone的专栏 - 博客频道 - CSDN.NET (2012年5月21日) java实现FTP多线程断点续传,上传下载! - java学习与交流 - j2ee学习网 - j2ee学习网 (2012年5月21日) 用 Java 实现断点续传 ...

    断点续传java实现

    java实现断点续传 private void setHeader(URLConnection con) { con .setRequestProperty( "User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 ...

    用Java 实现HTTP断点续传技术文档【附实例代码】

    ### Java实现断点续传的关键技术点 #### 1. 使用`HttpURLConnection`发送`RANGE`请求头 为了实现断点续传功能,客户端需要告诉服务器它希望从哪个位置开始下载文件。这是通过向服务器发送一个带有特殊`RANGE`请求...

    用Java实现断点续传(HTTP)

    Java作为一款广泛使用的编程语言,也提供了实现断点续传的能力。本篇文章将深入探讨如何用Java实现HTTP协议下的断点续传功能。 断点续传主要涉及两个关键部分:客户端和服务器端。客户端负责保存已下载的数据状态,...

    java断点续传Demo

    Java实现断点续传主要涉及以下几个关键步骤: 1. **检测本地文件状态**:首先,程序需要检查本地是否有部分已下载的文件,以及当前文件的大小。如果存在部分文件,记录其长度作为续传的起点。 2. **构建Range请求*...

    基于Vue和Java的断点续传与大文件上传系统设计源码

    本项目是一个基于Vue和Java的断点续传与大文件上传系统设计源码,共包含563个文件,其中包括258个Java文件、82个SVG文件等。系统采用了Vue-uploader和若依框架,为用户提供了一个便捷的文件上传解决方案。系统支持多...

    java断点续传上传

    下面将详细阐述Java实现断点续传上传的关键技术和步骤。 一、理解断点续传原理 断点续传的基本思想是保存已上传部分的信息,包括已上传的文件大小和最后的偏移位置。当上传中断后,服务器和客户端都保存这个信息,...

    java断点续传源代码

    下面我们将深入探讨Java实现断点续传的原理和关键点。 1. **断点续传的原理**: 断点续传的核心在于保存已下载部分的信息,通常包括已下载的文件大小、最后的偏移位置等。当下载中断后,系统会记录当前的下载状态...

Global site tag (gtag.js) - Google Analytics