必威体育Betway必威体育官网
当前位置:首页 > IT技术

HttpURLConnection方法之setRequestProperty()浅谈

时间:2019-08-19 01:15:33来源:IT技术作者:seo实验室小编阅读:63次「手机版」
 

setrequestproperty

前言:申请CSDN账号大概是四年前的事情了,想想的确的有点历史久远的感觉,只不过这段历史中,我的博客却是历史空白的,主要原因是,当时只是因为是计算机专业,而沽名钓誉的申请了个高大上的CSDN---中国最大的中文IT社区账号,中间经历了稀里糊涂匆匆大一、稍稍有点叱诧风云、指点江山的给力大二、紧接着铮铮铁骨、血性火热的绿色军营,辗转几个春夏轮回,我又回到了曾几何时的“历史舞台”,重新开始了我“武林秘籍”的修炼之旅,想想修炼成功之后,能与大神切磋武艺,能与女神技术交流,说不定还能勾搭个妹子,说不定哪天还能得到老板的慧眼识英才,赏赐个黄马褂,赐封个爵位啥的,哈哈~想想还真有点小激动呢~~~

扯的有点远了!现在峰回路转,回到主题。这是我的第一篇原创有关技术的博客,也是我技术学习和分享快乐的开始!同时我也是菜鸟一枚,希望大神们带我一起飞得意

【问题】关于从网上下载一个文件分多个线程同时下载。

主要使用到HttpURLConnection对象的setrequestproperty(String key,String value);方法

简单说一下如何使用,setRequestProperty()方法严格上讲是HttpURLConnection的父类---URLConnection的方法,而URL.openConnection()返回的是一个URLConnection对象,而一般我们都用他的子类HttpURLConnection去做链接和网络传输工作

【解决思路总述】

1,把指定文件(通过HttpURLConnection.getcontentLength();获得文件大小),分成指定线程数下载,或者指定每个线程承担下载任务的大小(再次我们仅以后者分析)

2,计算所需线程数

3,将获得的数据保存本地(使用RandomAccessFile流存储)

代码

package com.wsf.demo;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.filenotfoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

public class ImageDownload {

   public final static String sate = "http://www.baidu.com/img/bd_logo1.png";//本题所下载的文件是一个百度图标

   public static void main(String[] args) {

       try {

           //创建一个URL对象

           URL url = new URL(sate);

           //建立一个链接

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

           //制定相应方式

           conn.setRequestMethod("GET");

           //进行连接

           conn.connect();

           //获得响应码

           int code = conn.getresponseCode();

           //获得文件名字

           int position = sate.lastindexof("/");

           String fileName = sate.substring(position+1);

           System.out.println("服务器响应码:"+code);

           //如果响应码是200 则链接下载。。。

           if(code == HttpURLConnection.HTTP_OK){

               //获得文件长度

               int contentLength = conn.getContentLength();

               System.out.println("文件总长度:"+contentLength);

               //设定想要启动下载线程,用于把文件分成多少分进行下载

               RandomAccessFile raf = new RandomAccessFile(new File(fileName), "rwd");

               raf.setLength(contentLength);

               raf.close();

               

               //假定每个线程负责下载的长度为1k

               int blockSize = 1024*2;

               //如果能除尽指定线程数  否则线程数+1

               int size = contentLength%blockSize==0 ? contentLength/blockSize : (contentLength/blockSize)+1;

               

               for(int i = 0;i<size;i++){

                   if(i==(size-1)){

                       new DownLoadThread(i, (contentLength-(blockSize*i)), fileName,contentLength).start();

                       System.out.println("启动了第:"+i+"  线程---------------------"+(contentLength-(blockSize*i)));

                       return;

                   }

                   new DownLoadThread(i, blockSize, fileName,(i+1)*blockSize).start();

                   System.out.println("启动了第:"+i+"  线程---------------------"+blockSize);

               }

           }

       } catch (MalformedURLException e) {

           e.printstacktrace();

       } catch (IOException e) {

           e.printStackTrace();

       }

   }

}

class DownLoadThread extends Thread{

   private int fileCount;

   private int blockSize;

   private String fileName;

   private int TotalLength;

   

   public DownLoadThread(int fileCount,int blockSize,String fileName,int TotalLength){

       this.fileCount = fileCount;

       this.blockSize = blockSize;

       this.fileName = fileName;

       this.TotalLength= TotalLength;

       

   }

   @Override

   public void run() {

           try {

               URL url = new URL(ImageDownload.sate);

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

               conn.setRequestMethod("GET");

               conn.setRequestProperty("Range", "bytes="+(TotalLength-blockSize)+"-"+(TotalLength));

               conn.connect();

               System.out.println(fileCount+"开始:"+(TotalLength-blockSize)+",结束:"+TotalLength);

  //多线程同时下载文件,因此要使用随机访问文件流,即同时写入读取,seek(int index)制定存放的位置

               RandomAccessFile raf = new RandomAccessFile(new File(fileName), "rwd");

               raf.seek(TotalLength-blockSize);

               int code = conn.getResponseCode();

               System.out.println(fileCount+">>>Code>>>"+code);

               if(code == HttpURLConnection.HTTP_OK || code == 206){

                   BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());

                   int len = 0;                 

                   byte[]buf = new byte[1024];

                   while((len = bis.read(buf,0,buf.length))!=-1){

                       raf.write(buf, 0, len);

                       System.out.println(fileCount+"下载长度:"+len);

                   }

                   //回收资源

                   raf.close();

                   System.out.println("第"+fileCount+"段下载完毕!!!");

                   return;

               }

               System.out.println("第"+fileCount+"段下载失败!!!");

           } catch (FileNotFoundException e) {

               e.printStackTrace();

           } catch (IOException e) {

               e.printStackTrace();

           }

   }

}

相关阅读

HttpURLConnection方法之setRequestProperty()浅谈

【问题】关于从网上下载一个文件分多个线程同时下载。主要使用到HttpURLConnection对象的setRequestProperty(String key,String

详解HttpURLConnection

请求响应流程设置连接参数的方法setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachessetDefaultAllowU

分享到:

栏目导航

推荐阅读

热门阅读