代码没有优化,暂时先实现结果

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多线程下载的更多相关文章

  1. 『NiFi 学习之路』入门 —— 下载、安装与简单使用

    一.概述 "光说不练假把式." 官网上的介绍多少让人迷迷糊糊的,各种高大上的词语仿佛让 NiFi 离我们越来越远. 实践是最好的老师.那就让我们试用一下 NiFi 吧! 二.安装 ...

  2. JAVA多线程下载网络文件

    JAVA多线程下载网络文件,开启多个线程,同时下载网络文件.   源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...

  3. java多线程下载和断点续传

    java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...

  4. Java学习之路 -- Java怎么学?

    @ 目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...

  5. java 多线程下载功能

    import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; impo ...

  6. JAVA高级之路----JAVA多线程

    介绍 这段时间一直在学习和整理一些通往java高级程序猿必备的知识点,有些是工作中必须要知道的,有些是面试必须要知道的, 但是不管怎么样,学习了就不会有坏处,不可能全部记得住,最起码得雁过留痕,知识不 ...

  7. java 多线程下载文件 以及URLConnection和HttpURLConnection的区别

    使用 HttpURLConnection 实现多线程下载文件 注意GET大写//http public class MultiThreadDownload { public static void m ...

  8. Java多线程下载文件

    package com.test.download;   import java.io.File; import java.io.InputStream; import java.io.RandomA ...

  9. Java多线程下载器FileDownloader(支持断点续传、代理等功能)

    前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownload ...

随机推荐

  1. SQL 2008 清除数据库日志

    USE [master]GOALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO_WAITGOALTER DATABASE DNName SET RECO ...

  2. hdu 5124

    bc上的题目,很水,有很多方法做吧,题意大概就是给定你票数,然后让你求出票数最多的那个下标...... 之前我用两个for循环分开写,一个是读入,然后是判断,提交就wa,后来网上看了别人的,就是不能分 ...

  3. mysql limit性能问题

    offset大的时候的比较 1. SELECT * FROM persons LIMIT 200000,10; 耗时0.109s 2. SELECT *FROM persons WHERE id> ...

  4. Cookies欺骗分析与防护

    今天来谈谈cookies欺骗是怎么回事以及如何避免. 用户在登录之后通常会保存用户信息,以便在其他需要权限的页面去验证用户信息是否具有访问权限. 有同学说我在登录的时候已经很注意SQL注入问题了,还有 ...

  5. ImageView的学习

    学习安卓时我还是习惯看懂手册,虽然是英文但是可以获得的东西必然也是更多的,否则自己只能停留在拾人牙缝的水平,虽然我是初学,但是还是分享一些自己的学习过程及方法. 从手册中我们看以知道,ImageVie ...

  6. Jquery插件 easyUI属性汇总

    属性分为CSS片段和JS片段. CSS类定义:1.div easyui-window        生成一个window窗口样式.      属性如下:                   1)mod ...

  7. 配置CAS错误No Certificate file specified or invalid file format

    配置tomcat证书 keystore文件后启动一直报错:(tomcat版本:apache-tomcat-6.0.43) tomcat配置: <Connector port="8443 ...

  8. 不能将值 NULL 插入列 'ID',表 'EupStoreDemoDB.dbo.OrderDiary';列不允许有 Null 值。INSERT 失败。

    MVC,使用EF构建实体.将数据存入数据库,执行到_db.SaveChange()时,会报如下错误:

  9. 关于机器学习-EM算法新解

    我希望自己能通俗地把它理解或者说明白,但是,EM这个问题感觉真的不太好用通俗的语言去说明白,因为它很简单,又很复杂.简单在于它的思想,简单在于其仅包含了两个步骤就能完成强大的功能,复杂在于它的数学推理 ...

  10. 关于GestureDetector.OnGestureListener的onScroll参数distance问题

    关于GestureDetector.OnGestureListener类的onScroll方法参数distanceX和distanceY问题 看到有文章上说onScroll方法中distanceX和d ...