文档章节

一个多线程下载的例子

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/07
180
0
Android游戏开发之多线程的操作方式(二十六)

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

彭博
2012/03/09
107
0
iOS多线程编程之NSOperation和NSOperationQueue的使用

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

malawo
2013/09/05
0
0
java线程实战:多线程下载(下)

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

javaer
09/14
0
0
ios的线程和同步异步操作

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

lewis-180
2015/12/08
57
0

没有更多内容

加载失败,请刷新页面

加载更多

oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
今天
6
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
今天
5
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
33
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部