安卓学习之路 -- 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 ...
随机推荐
- C#第一节课
1,命名规范 A.如果声明一个变量,小写,如果有多个单词,后面首字母大写 如: string sString="aa"; int iNum=20; bool bMale=false ...
- CSS3 target 伪类不得不说那些事儿(纯CSS实现tab切换)
是不是觉得target有点眼熟?! 今天要讲的不是HTML的<a>标签里面有个target属性. target伪类是css3的新属性. 说到伪类,对css属性的人肯定都知道:hover.: ...
- gradle命令
gradle tasks 可以显示gradle可以做的任务. gradle build 就会生成jar包. build和clean install的作用是否一致?
- Debugging Failed Because Integrated Windows Authentication Is Not Enabled
To enable integrated Windows authentication Log onto the Web server using an administrator account. ...
- 本地连接速度100.0mbps变10.0mbps如何恢复
右键我的电脑--管理---设备管理器--网络适配器展开,可以看到网卡,右击属性--高级--连接速度和双工模式或(LINK SPEED)选项,选择100就好了 那么我们在选择的时候会有100M全双工 ...
- Oracle 优化——位图、函数等索引介绍
一.位图索引 我将使用一个例子,来描述位图索引的存储,并分析它的优点. Table :Loans 放贷信息 ID userId 行业投向 币种 证件类型 还本付息方式 状态 1 1 农业 人民币 身份 ...
- Objective-C学习篇07—NSArray与NSMutableArray
大纲 NSArray NSMutableArray 快速枚举 NSArray NSArray是一个静态数组,也就是一个不可变数组,一旦创建以后,就不能进行添加,删除或者修改其中的元素.NSArray继 ...
- 使用CAEmitterLayer实现下雪效果
效果图: 代码部分: #import "ViewController.h" @interface ViewController () @end @implementation Vi ...
- 查看sqlserver默认的编码格式
SQL语句:SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage') 936 简体中文GBK 950 繁体中文BIG ...
- Supervisor的一些基础使用
Supervisor是一个进程监控程序. 满足的需求是:我现在有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需要使用到了 ...