HttpURLConnection_浅析情绪管理的方法技巧论文

HttpURLConnection_浅析情绪管理的方法技巧论文前言申请CSDN账号大概是四年前的事情了,想想的确的有点历史久远的感觉,只不过这段历史中,我的博客却是历史空白的,主要原因是,当时只是因为是计算机专业,而沽名钓誉的申请了个高大上的CSDN—中国最大的中文IT社区账号,中间经历了稀里糊涂匆匆大一、稍稍有点叱诧风云、指点江山的给力大二、紧接着铮铮铁骨、血性火热的绿色军营,辗转几个春夏轮回,我又回到了曾几何时的“历史舞台”,重新开始了我“武林秘…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

申请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();
            }
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195071.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SoundFlower+QuickTime录屏Mac含系统声音[通俗易懂]

    SoundFlower+QuickTime录屏Mac含系统声音[通俗易懂]Mac自带的录屏软件QuickTime不能录系统声音。为此,使用soundflower插件来解决。其原理是添加虚拟声卡,使系统声音输出到该声卡,再将其作为QuickTime录屏的输入。soundflower是一个开源插件,已于2014年停止维护,但其最新版本仍可用于当前版本的mac。同一开发者开发了新软件Loopback,功能类似,多了图形界面。它更好用,但是录制20分钟后会人为加噪,迫使用户购买付费版本($99)????。soundflower最新release:https://github.com/

    2022年6月1日
    58
  • telnet远程登录AAA认证

    telnet远程登录AAA认证R1<Huawei>system-view//进入全局配置模式[Huawei]sysnameR1//改名[R1]undoinfo-centerenable//关闭信息告警提示[R1]interfaceg0/0/0//进入g/0/0接口[R1-GigabitEthernet0/0/0]ipaddress192.168.100…

    2022年6月7日
    39
  • C++17实现的读写锁「建议收藏」

    C++17实现的读写锁「建议收藏」1.shared_mutex和shared_lock很有意思的两个关于共享线程锁的特性#include#include<shared_mutex>#include#include#includeusingnamespacestd;classCounter{public:std::size_tGet()const{std::shared_lockstd:…

    2022年8月12日
    8
  • 游戏是怎么赚钱的 – 进阶篇[通俗易懂]

    游戏是怎么赚钱的 – 进阶篇[通俗易懂]首先回答几个常见的问题1、昨天提到的广州神武,其实是广州多益,主打产品叫做神武,感谢评论区勘误,这个公司创始人徐波也是个挺传奇的故事,然而很抱歉,今天不讲八卦,有兴趣的可…

    2022年7月19日
    27
  • awvs使用教程_awm20706参数

    awvs使用教程_awm20706参数目录:0×00、什么是AcunetixWebVulnarabilityScanner(WhatisAWVS?)0×01、AWVS安装过程、主要文件介绍、界面简介、主要操作区域简介(InstallAWVSandGUIDescription)0×02、AWVS的菜单栏、工具栏简介(AWVSmenubar&amp;toolsbar)0×03、开始一次…

    2022年9月23日
    4
  • idea2021.2.3激活码永久破解方法

    idea2021.2.3激活码永久破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    313

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号