android HTTP实现文件多线程下载

来源:互联网 发布:上海地铁软件 编辑:程序博客网 时间:2024/06/08 15:30

                           文件多线程下载                                                 

 

 

一、文件多线程下载步骤

        1、  获取网络文件的长度,在android客户端生成一个与网络文件长度相等的空文件

        2、  开启N条线程下载文件,计算每条线程负责下载的数据量

        3、  依次创建,启动多条线程分别从网络文件的不同位置下载数据,并从本地文件的相同位置写入数据,要计算出每条线程从网络文件的什么位置开始下载数据,到什么位置结束下载

 

具体步骤

        1、  打开HTTP协议的连接对象,为对象设置属性

    //path为源路径

             URL url = new URL(path);

                   HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                   conn.setConnectTimeout(5000);

                   conn.setRequestMethod("GET");

            2、判断请求是否成功

                   if(conn.getResponseCode() == 200){

             //步骤3 4 5 6

                   }

             (以下步骤均在请求成功的基础上去实实现)

            3、取得网络文件的长度

             int  length = conn.getContentLength();

 

            4、随机文件访问类来生成一个与网络文件长度相等的本地文件

                1>取得网络文件名称

                     String  filename = path.substring(path.lastIndexOf("/")+1);//从最后一个"/"开始获取

               2>创建文件

                   File file = new File(mubiao,filename); // mubiao指文件保存路径  filename为文件名称

                3>随机文件访问

                    RandomAccessFile accessFile = new RandomAccessFile(file,"rwd");

                4>设置文件长度

                    accessFile.setLength(length);

                     accessFile.close();

          5、计算每个线程负责下载的数据量

 

               int block  = length%threadsize == 0 ? length/threadsize :length/threadsize +1;

 

           6、循环实现线程的下载

            for(int  threadid = 0 ;threadid<threadsize;threadid++){

                            new DownloadThread(threadid,block,url,file).start();

            }

 

           7、创建线程类实现下载

            private class DownloadThread extends Thread{

                   private int threadid;

                   private int block;

                   private URL url;

                   private File file;

 

                   public DownloadThread(int threadid, int block, URL url, File file) {

                            this.threadid=threadid;

                            this.block=block;

                            this.url=url;

                            this.file=file;

                   }

                  

                   public void run(){

                             //计算该线程从网络文件的什么位置开始下载

                                int start = threadid * block ;

                               //下载到什么位置结束

                                int end= (threadid+1) * block-1 ;

                               try{

                                        //建随机文件访问类对象

                                        RandomAccessFile accessFile = new RandomAccessFile(file,"rwd");

                                       //指定从本地文件的某一个位置写入数据

                                        accessFile.seek(start);

//请求网络文件某一个区域的数据

                                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                                                   conn.setConnectTimeout(5000);

                                                   conn.setRequestMethod("GET");

                                                   conn.setRequestProperty("Range", "bytes="+start+"-"+end);

                                                   if(conn.getResponseCode() == 206){

                                                              InputStream instream = conn.getInputStream();

                                                   //循环读入数据

                                                   byte[] buffer = new byte[1024];

                                                   int len=0; //返回的读取到的长度

                                                   while((len = instream.read(buffer))!=-1){

                                                       //-------将数据写入本地文件

                                                       accessFile.write(buffer,0,len);

                                                   }      

                                                   accessFile.close();

                                                   instream.close();

                                                //   System.out.println(threadid+1+"线程下载完成") ;

                                                   }

                                                   else{

                                                   //      System.out.println(threadid+1+"线程下载失败") ;

                                                   }

                                      

                                       

                               }catch(Exception e){

                                        e.printStackTrace();

                               }

                   }       

         }

 

 重写线程的run方法

   1>计算该线程从网络文件的什么位置开始下载

    int start = threadid * block ;

   2>下载到什么位置结束

    int end= (threadid+1) * block-1 ;

    3>建随机文件访问类对象

    RandomAccessFile accessFile = new RandomAccessFile(file,"rwd");

    4>指定从本地文件的某一个位置写入数据

    accessFile.seek(start);

    5>请求网络文件某一个区域的数据

      1 得到HttpURLConnection对象,并设置属性

          HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                    conn.setConnectTimeout(5000);

                    conn.setRequestMethod("GET");

      2 使用HTTPRange头字段指定每条线程从文件的什么位置开始下载

        下载到什么位置结束

        conn.setRequestProperty("Range", "bytes="+start+"-"+end);

     

      3 判断请求是否成功断点下载的返回码为206

        if(conn.getResponseMethod()==206){ 

             //步骤4

 

 

        }

       

        4 得到输入流,通过输入流得到数据,将数据写入本地文件

          InputStream instream = conn.getInputStream();

          //循环读入数据

          byte[] buffer = new byte[1024];

          int len=0; //返回的读取到的长度

          while((len = instream.read(buffer))!=-1){  //如果不为-1说明数据没有读完

              //-------将数据写入本地文件

              accessFile.write(buffer,0,len);

          }      

          accessFile.close();

          instream.close();

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 艾滋病看守所不收怎么办 没能力偿还债务怎么办 监狱病人的癌症怎么办 监狱的传染病人怎么办 犯人在监狱重病怎么办 亲戚被关拘留所怎么办 打麻将被拘留怎么办 轻伤检察院不批捕怎么办 吸毒人被拘留怎么办 法院拘留没去怎么办 羁押期限超过了怎么办 羁押期限已满怎么办 刑事拘留22天了怎么办 被派出所拘留 车怎么办 被公安怀疑贩毒怎么办 报案后证据不足怎么办 担心丈夫复嫖怎么办 交通事故当事人重伤笔录怎么办 交通事故做完笔录后怎么办 罚款单子丢了怎么办 刑事案件人跑了怎么办 打架当事人跑了怎么办 赌博被派出所抓怎么办 治安案件人跑了怎么办 去警察局做笔录怎么办 未成年打架留下案底怎么办 土地被别人侵占怎么办 在公安局有案底怎么办 做小姐有案底怎么办 党员被黑社会打怎么办 周期内被扣15分怎么办 驾证扣了50分怎么办? 酒驾拘留工作怎么办 开电动车被拘留怎么办 有一次吸毒案底怎么办 家里收到拘留书怎么办 吸毒有案底结婚怎么办 坐牢了房子按揭怎么办 被刑事拘留15天怎么办 看守所没人交生活费怎么办 判刑后看守所拒收怎么办