断点续传的代码

来源:互联网 发布:软件出现乱码怎么办 编辑:程序博客网 时间:2024/06/08 21:07
注意事项:每次写流的时候,记得关掉,否则会出现,写到后面的流使用的文件等东东会出现删不掉的情况,影响用户的体验

publicclassMultidload {
      staticintThreadCount= 3;
      staticintfinishedThread= 0;
      //确定下载地址
      staticStringpath="http://192.168.6.125:8080/TakeColor.exe";
     
      publicstaticvoidmain(String[] args){
      
      //发送get请求,请求这个资源的地址
      try{
          URL url =newURL(path);
         HttpURLConnection conn =(HttpURLConnection) url.openConnection();
         conn.setRequestMethod("GET");
         conn.setConnectTimeout(5000);
         conn.setReadTimeout(5000);
        
        if(conn.getResponseCode()==200){
          //拿到所请求文件的大小
        intlength = conn.getContentLength();
         File file =newFile("TakeColor.exe");
        //生存临时文件
         RandomAccessFile raf =newRandomAccessFile(file,"rwd");
        //设置临时文件的大小
         raf.setLength(length);
         raf.close();
        //计算出每个线程应该下载多少字节
        intsize =length /ThreadCount;
        
        for(inti =0;i<ThreadCount;i++){
          //计算线程开始和结束的下载位置
          intstartIndex = i * size;
          intendIndex = (i + 1) * size - 1;
          //如果是最后一个线程,那么结束的位置写死
          if(i==ThreadCount-1){
               endIndex = length-1;
          }
          System.out.println("线程"+ i +"的下载区间是:"+startIndex +"---"+ endIndex);
          newDownLoadThread(startIndex,endIndex,i).start();
           }
         }
       }catch(Exception e) {
          //TODOAuto-generated catch block
          e.printStackTrace();
     }
   }
}
 
      
 
 classDownLoadThreadextendsThread{
       intstartIndex;
       intendIndex;
       intthreadId;
       publicDownLoadThread(intstartIndex,intendIndex,intthreadId){
            super();
             this.startIndex=startIndex;
          this.endIndex=endIndex;
          this.threadId=threadId;
        }
      
        publicvoidrun() {
          
          //TODOAuto-generated method stub
          //再次发送http请求,下载原文件
              HttpURLConnection conn;
              try{
                   File progressFile =newFile(threadId+".text");
                   //判断进度临时问价是否存在
                   if(progressFile.exists()){
                        FileInputStream fis =newFileInputStream(progressFile);
                        BufferedReader br =newBufferedReader(newInputStreamReader(fis));
                        
                        //从进度临时文件中读取上一次临时文件下载的总进度,然后与原本的开始位置相加,得到新的开始位置
                        startIndex+=Integer.parseInt(br.readLine()) ;
                        fis.close();
                   }
                   
                   URL url =newURL(Multidload.path);
                   conn = (HttpURLConnection) url.openConnection();
                   conn.setRequestMethod("GET");
                   conn.setConnectTimeout(5000);
                   conn.setReadTimeout(5000);
                   //设置本次http请求所请求的数据的区间
                   conn.setRequestProperty("Range","bytes="+startIndex+"-"+endIndex);
                   
                   //请求部分数据,响应码是206
                   if(conn.getResponseCode()==206){
                        //流里此时只有1/3原文件的数据
                       InputStream is = conn.getInputStream();
                        byte[] b=newbyte[1024];
                        intlen =0;
                        inttotal=0;
                        //拿到临时文件的输出流
                         File file =newFile("TakeColor.exe");
                        //生存临时文件
                         RandomAccessFile raf =newRandomAccessFile(file,"rwd");
                        //把文件的写入位置移动至startIndex
                         raf.seek(startIndex);
                        while((len = is.read(b))!=-1){
                              raf.write(b, 0, len);
                              total +=len;
                              System.out.println("线程"+threadId+"下载了"+total);
                             
                             //生成一个专门用来记录下载进度的临时文件
                             
                              RandomAccessFile progressRaf =newRandomAccessFile(progressFile,"rwd");
                             //每次读取流里的数据之后,同步把当前线程的总进度写进临时文件中
                              progressRaf.write((total+"").getBytes());
                              progressRaf.close();
                         }
                        raf.close();
                        
                        Multidload.finishedThread++;
                        synchronized(Multidload.path) {
                             if(Multidload.finishedThread==Multidload.ThreadCount){
                                  for(inti= 0; i < Multidload.ThreadCount;i++) {
                                      File f =newFile(i+ ".text");
                                      f.delete();        
                                  }
                                  Multidload.finishedThread= 0;
                                  
                             }
                             
                        }
                        
                    }
              }catch(IOException e) {
                   //TODOAuto-generated catch block
                   e.printStackTrace();
              }
          
         }
 }
0 0
原创粉丝点击