安卓学习之路 -- JAVA多线程下载
代码没有优化,暂时先实现结果
package download; import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL; /**
* @author Liu Yutao
* @className Down
* @email koal@vip.qq.com
* @date 2016/4/7 21:11
*/ public class Down { //下载地址
public static final String DOWNFILE = "http://219.150.176.188/files/WindowsXP_SP2.exe";
//线程数
public static final int THREADCOUNT = 5; //格式化文件,得到文件名称
public static String formatFileName(String value) {
//得到最后一个/位置
int indexOf = value.lastIndexOf("/");
//截取/WindowsXP_SP2.exe文件名
String fileName = value.substring(indexOf + 1, value.length());
return fileName;
} //下载文件
public static void httpDownload(String downfile) {
try {
URL url = new URL(DOWNFILE);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//超时5秒
connection.setReadTimeout(5000);
connection.setRequestMethod("GET");
int code = connection.getResponseCode();
if (code == 200) {
//得到文件长度
long length = connection.getContentLength();
InputStream stream = connection.getInputStream();
File file = new File(formatFileName(DOWNFILE));
//用于创建一个和目标文件大小一样的空文件,为了就是占坑(rw是可读可写模式read,write)
RandomAccessFile accessFile = new RandomAccessFile(file, "rw");
accessFile.setLength(length);
//分10个线程,每个线程的区块长度(总长度 ÷ 个数)
long blockSize = length / THREADCOUNT;
for (int threadId = 0; threadId < THREADCOUNT; threadId++) {
//开始区块
// 当前循环线程编号 x 当前线程区块长度(0x1024,1x1024,2x1024)
long beginIndex = threadId * blockSize;
//结束区块
// 当前线程+1 x 每个区块大小 = 下次循环的开始区块,再 -1 就等于本次区块的最后位置
long endIndex = (threadId + 1) * blockSize - 1;
//是否最后一个线程
if (threadId == (THREADCOUNT - 1)) {
endIndex = length - 1;
}
System.err.println("当前线程:" + (threadId+1) + ",开始区块:" + beginIndex + ",结束区块:" + endIndex);
new ThreadDownloadRun(threadId, beginIndex, endIndex).start();
}
}
} catch (Exception e) {
e.printStackTrace();
}
} public static class ThreadDownloadRun extends Thread { private long threadId;
private long beginIndex;
private long endIndex; //构造
public ThreadDownloadRun(long threadId, long beginIndex, long endIndex) {
this.threadId = threadId;
this.beginIndex = beginIndex;
this.endIndex = endIndex;
} @Override
public void run() {
try {
System.err.println("当前线程:" + (threadId+1) + ",开始下载......");
URL url = new URL(DOWNFILE);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
//设置http文件头的range(区间)
urlConnection.setRequestProperty("Range", "bytes=" + beginIndex + "-" + endIndex);
int code = urlConnection.getResponseCode();
//区间返回是206
if (code == 206) {
//得到数据
InputStream stream = urlConnection.getInputStream();
File file = new File(formatFileName(DOWNFILE));
RandomAccessFile accessFile = new RandomAccessFile(file, "rw");
//设置RandomAccessFile写入文件的区块开始长度
accessFile.seek(beginIndex);
//下载开始
byte[] bytes = new byte[1024 * 1024];
int len = 0;
while ((len = stream.read(bytes)) > 0) {
accessFile.write(bytes, 0, len);
}
accessFile.close();
stream.close();
System.err.println("当前线程:" + (threadId+1) + ",下载结束!!!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
httpDownload(DOWNFILE);
}
}

安卓学习之路 -- JAVA多线程下载的更多相关文章
- 『NiFi 学习之路』入门 —— 下载、安装与简单使用
一.概述 "光说不练假把式." 官网上的介绍多少让人迷迷糊糊的,各种高大上的词语仿佛让 NiFi 离我们越来越远. 实践是最好的老师.那就让我们试用一下 NiFi 吧! 二.安装 ...
- JAVA多线程下载网络文件
JAVA多线程下载网络文件,开启多个线程,同时下载网络文件. 源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...
- java多线程下载和断点续传
java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...
- Java学习之路 -- Java怎么学?
@ 目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...
- java 多线程下载功能
import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...
- JAVA高级之路----JAVA多线程
介绍 这段时间一直在学习和整理一些通往java高级程序猿必备的知识点,有些是工作中必须要知道的,有些是面试必须要知道的, 但是不管怎么样,学习了就不会有坏处,不可能全部记得住,最起码得雁过留痕,知识不 ...
- java 多线程下载文件 以及URLConnection和HttpURLConnection的区别
使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...
- Java多线程下载文件
package com.test.download; import java.io.File; import java.io.InputStream; import java.io.RandomA ...
- Java多线程下载器FileDownloader(支持断点续传、代理等功能)
前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownload ...
随机推荐
- Android - Ashmem驱动
以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luosheng ...
- HDu -2844 Coins多重背包
这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就 ...
- ListActivity ListView 使用 介绍 用法
ListActivity简单的说就是ListView和Activity的结合,跟ListView和Activity组合实现的没有什么很大的差别,主要是比较方便. 在实现时,要注意: 1.一般情况,Li ...
- python对象(腌制)
python的内置对象类型主要有数字,字符串,列表,元祖,字典,集合等等,在python中,一切皆为对象 #腌制在python中如果我们有一些对象需要持久性存储,并且不丢失我们这个对象的类型与数据,我 ...
- unable to convert MySQL date/time value to System.DateTime
今天 用C# MySql做项目的时候 遇到了 unable to convert MySQL date/time value to System.DateTime 这样的异常错误,这个原因是因为:表里 ...
- expr的简单应用
expr命令 是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串. –格式为: expr expression_r(命令读入Expression 参数 ...
- DIY一款C/C++编译器
一. 原理 1.1 记事本编程 我们用记事本新建一个文件,文件后缀改成.c,例如文件名叫做"1.c",在文件里写上最简单的C或者C++代码, #include<stdio.h ...
- jsp页面间的传值
很多的时候我们只是把我们需要的数据,查询出来,然后用request.setAttribute("" ,"" )方法保存这个数据集合.再在我们能跳转到的下一个js ...
- thrift之TTransport类体系原理及源码详细解析1-类结构和抽象基类
本章主要介绍Thrift的传输层功能的实现,传输的方式多种多样,可以采用压缩.分帧等,而这些功能的实现都是相互独立,和上一章介绍的协议类实现方式比较雷同,还是先看看这部分的类关系图,如下: 由上面的类 ...
- JS-商品图片放大器
//给mask添加事件,让其随着鼠标移动 superMask.onmousemove=function(){ var left=event.offsetX-175/2; left=left>0? ...