文档章节

一个多线程下载的例子

Eviltuzki
 Eviltuzki
发布于 2014/10/05 23:36
字数 655
阅读 24
收藏 1

多线程下载,大概意思就是说,本地先用RandomAccessFile创建一个文件,设置好大小。把服务器端的文件分成多个块(分成几块就是几个线程),每个块对应的开启一个线程下载,形成一个文件。好处嘛,大家都知道。。速度快了呗~

老规矩,先把核心代码弄上来

线程主体内容

public void run() {
            try {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Range", "bytes=" + startIndex + "-"+ endIndex);
                conn.setConnectTimeout(5000);
                int code = conn.getResponseCode();
                System.out.println("code:"+code);
                InputStream is = conn.getInputStream();
                File file = new File("temp.msi");
                RandomAccessFile raf = new RandomAccessFile(file, "rw");
                raf.seek(startIndex);
                System.out.println("第" + threadId + "个线程:写文件的开始位置:" + String.valueOf(startIndex));
                byte[] buffer = new byte[1024];
                int len=0;
                while((len=is.read(buffer))!=-1){
                    raf.write(buffer,0,len);
                }
                raf.close();
                is.close();
                System.out.println("线程"+threadId+"下载完毕");
            } catch (Exception e) {                
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }

然后是main函数核心内容

String path = "http://192.168.1.102:8080/test/zip.msi";
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        int code = conn.getResponseCode();
        if(code==200){
            long size=conn.getContentLength();
            blocksize=size/threadCount;
            System.out.println("服务器文件大小:"+size);
            File file = new File("temp.msi");
            RandomAccessFile raf = new RandomAccessFile(file, "rw");
            raf.setLength(size);
            for (int i = 1; i <= threadCount; i++) {
                long startIndex=(i-1)*blocksize;
                long endIndex=i*blocksize-1;
                if(i==threadCount){
                    endIndex=size;
                }
                System.out.println("开启线程:" + i + "下载的位置:" + startIndex + "~"+ endIndex);
                new DownloadThread(i, startIndex, endIndex, path).start();
            }            
        }
        conn.disconnect();

核心内容就这么多

只有两个地方还是不太明白,一个是RandomAccessFile的相关操作,还有一个就是blocksize一会+1一会又删掉,这块得好好研究一下。

另外看了好几天HttpURLConnection的视频了,大概也了解这玩意的操作过程了

1.创建一个URL对象,姑且就叫url吧

2.调用url的openConnection()方法(囧,之前的错误就是调用了url.getContent()这玩意,查了半天错误。。。)

3.设置一堆属性(各类超时时间,请求方法。。。)

4.得到状态码,也就是getResponseCode()

5.判断一下这个状态码,一般请求成功都是200,分段文件是206,貌似现在很多框架都是判断这个状态码整除100是不是等于2,也就是说状态码是2XX的时候,基本都是成功- -~~~~

6.判断没问题之后,基本就是用InputStream接收了getInputStream()

7.对流进行操作吧。。。。。转成字符串还是写成文件。。。随你怎么整吧。。。

8.记得关闭流和连接-0-~~~

9.。。。。貌似没有了。。我想到的就这么多了= =~~~~

10......滚去碎觉............剩下明天再说,明天回学校。。该干嘛干嘛去

© 著作权归作者所有

共有 人打赏支持
Eviltuzki
粉丝 5
博文 31
码字总数 11990
作品 0
朝阳
程序员
Android游戏开发之多线程的操作方式(二十六)

Android游戏开发之多线程的操作方式 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6706952 游戏开发与软件开发多线程...

彭博
2012/03/09
51
0
Android游戏开发之多线程的操作方式(二十六)

Android游戏开发之多线程的操作方式 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6706952 游戏开发与软件开发多线程...

晨曦之光
2012/03/07
177
0
iOS多线程编程之NSOperation和NSOperationQueue的使用

目录(?)[-] iOS多线程编程之NSThread的使用 使用 NSOperation的方式有两种 一种是用定义好的两个子类 另一种是继承NSOperation NSInvocationOperation例子 第二种方式继承NSOperation 如何控...

malawo
2013/09/05
0
0
ios的线程和同步异步操作

ios的线程和同步异步操作 ios的线程和同步异步操作 ios的多线程,同步异步操作,都是我们日常的开发中经常会遇到的问题,本文把常见的ios线程,同步异步的操作进行了整理。 代码下载: 我博客...

lewis-180
2015/12/08
57
0
java线程实战:多线程下载(下)

多线程下载业务逻辑: 1、URL请求获取下载文件的大小、计算每个线程下载的起始位置 2、RandomAccessFile类在存储空间占位,随机访问流在多线程下可同时读写文件 3、开启线程,每个线程负责下...

javaer
09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sourcetree 离线免注册登录安装教程

Sourcetree是一个优秀的git可视化管理工具,深受开发者喜爱Sourcetree官网,但是在安装时需要谷歌账户登录,需要翻qiang才可以,此一点一直被人们所诟病。今天本教程就为大家提供离线免登陆安...

QQZZFT
11分钟前
0
0
使用 PostgreSQL 解决一个实际的统计分析问题

使用 PostgreSQL 解决一个实际的统计分析问题作者:老农民(刘启华)Email: 46715422@qq.com 之前有个朋友扔给我一个奇葩需求,他们公司之前做了一批问卷调查,全部都是统一格式的excel...

新疆老农民
14分钟前
0
0
TypeScript基础入门之高级类型的映射类型

转发 TypeScript基础入门之高级类型的映射类型 高级类型 映射类型 一个常见的任务是将一个已知的类型每个属性都变为可选的: interface PersonPartial {    name?: string;    age?...

durban
29分钟前
0
0
Dubbo源码分析(6):Dubbo内核实现之基于SPI思想Dubbo内核实现

SPI接口定义 定义了@SPI注解 package com.alibaba.dubbo.common.extension; import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.an......

郑加威
29分钟前
0
0
RxJS的另外四种实现方式(后记)—— 同时实现管道和链式编程

目录 RxJS的另外四种实现方式(序) RxJS的另外四种实现方式(一)——代码最小的库 RxJS的另外四种实现方式(二)——代码最小的库(续) RxJS的另外四种实现方式(三)——性能最高的库 Rx...

一个灰
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部