Android中 多线程下载原理
来源:互联网 发布:ubuntu ntp设置 编辑:程序博客网 时间:2024/05/22 15:22
计算每个线程的下载起始终止位置公式如下
文件读写方式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 = "http://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程序,结果展示
此时会发现工程源码目录下生成了下载完成的gaosu.jsp文件
0 3
- Android中 多线程下载原理
- android多线程下载原理
- Android多线程下载原理
- Android中多线程下载
- Android中多线程下载
- android中多线程下载
- Android实现网络多线程断点续传下载原理
- Android:网络:多线程下载(原理)
- Android中http多线程下载
- Android中多线程下载文件
- Android 中实现多线程下载和断点续传的原理和代码
- Android多线程断点下载之多线程下载原理
- Android多线程断点下载之多线程断点下载原理
- 多线程下载原理
- 多线程断点下载原理
- 多线程下载的原理
- 多线程下载的原理
- 多线程下载及原理
- SDN应用场景实践--指定业务带宽保障
- win32 创建右键菜单
- Unique Binary Search Trees-LeetCode
- hdu 2952 Counting Sheep
- JS 父页面接收子页面返回值
- Android中 多线程下载原理
- Remove Duplicates from Sorted Array
- java笔记14 包
- 遗传算法
- 为什么碱中毒会导致低钙血症?
- 旋转数组中查找指定元素
- cf307_B
- docker常用技巧汇总
- mysql 增量卸数脚本