文档章节

一个多线程下载的例子

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

多线程下载,大概意思就是说,本地先用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 ⋅ 0

Android游戏开发之多线程的操作方式(二十六)

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

晨曦之光 ⋅ 2012/03/07 ⋅ 0

iOS多线程编程之NSOperation和NSOperationQueue的使用

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

malawo ⋅ 2013/09/05 ⋅ 0

ios的线程和同步异步操作

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

lewis-180 ⋅ 2015/12/08 ⋅ 0

Android多线程:继承Thread类 & 实现Runnable接口 使用解析(含实例教程)

前言 在开发中,多线程的使用十分常见 今天,我将全面解析多线程中最常见的2种用法:继承类 & 实现接口 Part 1:继承Thread类 目录 1. 简介 class MyThread extends Thread{ // 步骤2:复写r...

carson_ho ⋅ 05/30 ⋅ 0

一个来自Afinal断点下载BUG的解决方案

作为国内第一个Android开发框架Afinal,相信有很多开发者都知道的。虽然随着Android版本的迭代,其中有一些方法有了更好的解决办法但从来没有人怀疑Afinal的价值。 最近在做一个断点下载的功...

kymjs张涛 ⋅ 2014/12/14 ⋅ 14

Python爬虫关于urlretrieve()函数的使用笔记

urllib 模块提供的 urlretrieve() 函数。urlretrieve() 方法直接将远程数据下载到本地。 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。) 参数 re...

楠木楠 ⋅ 2016/09/19 ⋅ 0

Android异步加载全解析之使用AsyncTask

Android异步加载全解析之使用AsyncTask 概述 既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅可以对并发线程进行管理,更可以提高他们执行的效率,优化整个App。当然我们可以自...

eclipse_xu ⋅ 2015/03/19 ⋅ 0

抓妹子图平台的实现,你们就是喜欢这种东西,对吧?(之三)抓图流程的实现

福利,三俗,喜闻乐见 为了后面能够接上web界面,需要一个可随时提供查询和推送信息的结构。一开始,逻辑不用做得太复杂,也不用过多考虑性能问题,只要保证了这样的结构,以后再修改也是可以...

ueharaai ⋅ 2013/08/18 ⋅ 3

Android异步加载全解析之使用多线程

异步加载之使用多线程 初次尝试 异步、异步,其实说白了就是多任务处理,也就是多线程执行,多线程那就会有各种问题,我们一步步来看,首先,我们创建一个class——ImageLoaderWithoutCache...

eclipse_xu ⋅ 2015/03/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 58分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部