频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android中 多线程下载原理
2015-06-15 10:47:42         来源:小地盘的诺克萨斯  
收藏   我要投稿

这里写图片描述

计算每个线程的下载起始终止位置公式如下
这里写图片描述

文件读写方式4中类型
这里写图片描述

工程源码目录
这里写图片描述

package cn.itcast.download;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class MulThreadDownloader {

    public static void main(String[] args) throws Exception {
        String path = "https://219.245.72.241:8080/web3/gaosu.jsp";//服务器文件的地址
        int threadsize = 3;//开启三个线程,android应用中开启的线程数不能太多
        new MulThreadDownloader().download(path, threadsize);

    }

    private void download(String path, int threadsize) throws Exception {
        URL downpath = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        if(conn.getResponseCode() == 200){
            int length = conn.getContentLength();//获取网络文件的长度
            File file = new File(getFileName(path));
            RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");//生成本地文件
            accessFile.setLength(length);
            accessFile.close();
            //计算每条线程负责下载的数据量
            int block = length % threadsize == 0 ? length / threadsize : length / threadsize +1;
            for(int threadid = 0 ; threadid < threadsize ; threadid++){
                new DownloadThread(threadid, downpath, block, file).start();
            }
        }
    }
    //负责下载操作
    private final class DownloadThread extends Thread{
        private int threadid;
        private URL downpath;
        private int block;
        private File file;

        public DownloadThread(int threadid, URL downpath, int block, File file) {
            this.threadid = threadid;
            this.downpath = downpath;
            this.block = block;
            this.file = file;
        }
        public void run() {
            int startposition = threadid * block;//从网络文件的什么位置开始下载数据
            int endposition = (threadid+1) * block - 1;//下载到网络文件的什么位置结束
            //指示该线程要从网络文件的startposition位置开始下载,下载到endposition位置结束
            //Range:bytes=startposition-endposition
            try{
                RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
                accessFile.seek(startposition);//移动指针到文件的某个位置
                HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();
                conn.setConnectTimeout(5000);
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);//区域下载
                //分段下载请求码不是200,而是206
                //if(conn.getResponseCode() == 206){
                InputStream inStream = conn.getInputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                while( (len = inStream.read(buffer)) != -1 ){
                    accessFile.write(buffer, 0, len);
                }
                accessFile.close();
                inStream.close();
                System.out.println("第"+ (threadid+1)+ "线程下载完成");
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 获取文件名称
     * @param path 下载路径
     * @return
     */
    private static String getFileName(String path) {
        return path.substring(path.lastIndexOf("/")+ 1);
    }

}

客户端要下载服务器web3目录里的gaosu.jsp文件
这里写图片描述

启动tomcat,挂起服务器web3
这里写图片描述

运行上面的java程序,结果展示
这里写图片描述

此时会发现工程源码目录下生成了下载完成的gaZ喎"/kf/ware/vc/" target="_blank" class="keylink">vc3UuanNwzsS8/jxiciAvPg0KPGltZyBhbHQ9"这里写图片描述" src="/uploadfile/Collfiles/20150615/2015061508541077.png" title="" />

点击复制链接 与好友分享!回本站首页
相关TAG标签 线程 原理
上一篇:Android中的数据共享-application context
下一篇:Android应用程序UI硬件加速渲染的Display List渲染过程分析
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站