java安卓下载_安卓学习之路 -- JAVA多线程下载

packagedownload;importjava.io.File;importjava.io.InputStream;importjava.io.RandomAccessFile;importjava.net.HttpURLConnection;importjava.net.URL;/***@authorLiu Yutao

* @className Down

* @email koal@vip.qq.com

* @date 2016/4/7 21:11*/

public classDown {//下载地址

public static final String DOWNFILE = "http://219.150.176.188/files/WindowsXP_SP2.exe";//线程数

public static final int THREADCOUNT = 5;//格式化文件,得到文件名称

public staticString formatFileName(String value) {//得到最后一个/位置

int indexOf = value.lastIndexOf("/");//截取/WindowsXP_SP2.exe文件名

String fileName = value.substring(indexOf + 1, value.length());returnfileName;

}//下载文件

public static voidhttpDownload(String downfile) {try{

URL url= newURL(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= newFile(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);newThreadDownloadRun(threadId, beginIndex, endIndex).start();

}

}

}catch(Exception e) {

e.printStackTrace();

}

}public static class ThreadDownloadRun extendsThread {private longthreadId;private longbeginIndex;private longendIndex;//构造

public ThreadDownloadRun(long threadId, long beginIndex, longendIndex) {this.threadId =threadId;this.beginIndex =beginIndex;this.endIndex =endIndex;

}

@Overridepublic voidrun() {try{

System.err.println("当前线程:" + (threadId+1) + ",开始下载......");

URL url= newURL(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= newFile(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 voidmain(String[] args) {

httpDownload(DOWNFILE);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值