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

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. 27个Jupyter快捷键、技巧(原英文版)

    本文是转发自:https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/ 的一篇文章,先记录在此,等有空时我会翻译成中文 ...

  2. SQLServer 工具技巧

    SQLServerProfiler 的使用 http://www.jikexueyuan.com/course/1712.html

  3. 二叉树(二叉链表实现)JAVA代码

      publicclassTest{       publicstaticvoid main(String[] args){           char[] ch =newchar[]{'A','B ...

  4. codevs 4650 破损的键盘(链表)

    /* 之前一直不重视链表 (好吧说实话主要是看着板子都是指针就怂了T.T) 这道题比较基础 应用了链表的思想 数组模拟指针 遇到的问题就是跑着跑着光标跳到前面或者跳到后面 我们用next储存每个点下一 ...

  5. div 固定宽高 水平垂直居中方法

    div固定宽高,水平垂直居中,根据所用单位不同,分成两种情况,分别是"px"和"%"情况. 例:将三层div做出三个边框,要求水平垂直居中.效果如图 情况一(单 ...

  6. mySQL优化 my.ini 配置说明

    [mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-name-resolve #禁止MySQL对外部连接进行DNS解析,使用 ...

  7. Lua 基础知识-面向对象

    通过函数闭包的方式来实现面向对象 -- 通过函数闭包的方式来实现面向对象 function People(name) local self = {} local function init() sel ...

  8. java学习笔记 (9) —— Struts2 国际化

    1.Test.java package com.i18n; import java.util.Locale; public class Test1 { public static void main( ...

  9. HTML5 web开发时遇到的一个奇葩问题。

    昨天做了一个手机端的H5 页面. 首先就是各种兼容测试,调整修复..一系列操作之后,拿过来N多手机神马华为.小米.三星.水果5.6.plus,一番测试之后.嗯,还不错,稍作等待之后就上线了. 这是分割 ...

  10. [算法导论]贪心算法(greedy algorithm)

    转载请注明出处:http://www.cnblogs.com/StartoverX/p/4611544.html 贪心算法在每一步都做出当时看起来最佳的选择.也就是说,它总是做出局部最优的选择,寄希望 ...