Java 仿迅雷多线程下载
package net.webjoy.jackluo.android_json; /**
* 1.http Range "bytes="+ start+end
* 2.RandomAccessFile设置写入的位置
* 3开启多线程下载
*
* Created by jackluo on 9/30/15.
*/ import android.os.Environment;
import android.os.Handler;
import android.os.Message; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors; /**
* 多线程下载
*/
public class DownLoad {
//创建一个线程池 创建三个线程
private Executor threadPool = Executors.newFixedThreadPool(3); private Handler handler; public DownLoad(Handler handler){
this.handler = handler;
} //创建一个线程池对象
static class DownLoadRunnable implements Runnable{ private String url;
private String fileName;
private long start ;//开始位置
private long end;//结束位置
private Handler handler;
public DownLoadRunnable(String url,String fileName,long start,long end,Handler handler){
this.url = url;
this.fileName = fileName;
this.start = start;
this.end = end;
this.handler = handler;
} @Override
public void run() { try {
URL httpUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
//设置下载位置 向服务器拿到指定的流信息
connection.setRequestProperty("Range", "bytes=" + start + "-" + end);
//创建一个文件 根据指定位置写入信息
RandomAccessFile accessFile = new RandomAccessFile(new File(fileName),"rwx");
accessFile.seek(start);//设置读写的位置
InputStream inputStream = connection.getInputStream();
byte[] b = new byte[1024*4];//设置缓冲区的大小存
int len=0;
while ((len = inputStream.read(b))!=-1){
accessFile.write(b,0,len);
}
if (accessFile !=null){
accessFile.close();
}
if (inputStream !=null){
inputStream.close();
}
//给主线程发送一个消息
Message message = new Message();
message.what = 1;
handler.sendMessage(message); } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
} public void downLoadFile(String url){
try {
URL httpUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
int count = connection.getContentLength();//获取了图片的大小
int block = count/3; //算线程的启始位置
String fileName = getFileName(url);
File parent = Environment.getExternalStorageDirectory();
File fileDownLoad = new File(parent,fileName);
/**
* 11 / 3 = 每个下载 3个字节3 还余出2个字节空间
* 第一个线程 0-2
* 第二个线程 3-5
* 第三个线程 6-10
*
*
*/
for (int i=0;i<3;i++){
long start = i*block;
long end = (i+1)*block -1;
if (i==2){
end = count;
}
DownLoadRunnable runnable = new DownLoadRunnable(url, fileDownLoad.getAbsolutePath(),start,end,handler);
//提交任务
threadPool.execute(runnable);
} } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取 URL后缀名
*/
public String getFileName(String url){
return url.substring(url.lastIndexOf("/")+1);
} }
package net.webjoy.jackluo.android_json; import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class DownLoadActivity extends AppCompatActivity { private Button button;
private TextView textView;
private int count =1;
private Handler handler = new Handler(){ @Override
public void handleMessage(Message msg) {
//super.handleMessage(msg);
int result = msg.what;
count +=result;
if (count==3){
textView.setText("download success");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_down_load); button = (Button) findViewById(R.id.downlad_btn);
textView = (TextView) findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { new Thread(){
@Override
public void run() {
DownLoad load = new DownLoad(handler);
load.downLoadFile("http://news.jsyks.com/photo/img1a.xgo-img.com.cn/pics/737/736406.jpg");
}
}.start(); }
});
} }
Java 仿迅雷多线程下载的更多相关文章
- Android学习记录(4)—在java中学习多线程下载的基本原理和基本用法①
多线程下载在我们生活中非常常见,比如迅雷就是我们常用的多线程的下载工具,当然还有断点续传,断点续传我们在下一节来讲,android手机端下载文件时也可以用多线程下载,我们这里是在java中写一个测试, ...
- Android学习记录(5)—在java中学习多线程下载之断点续传②
在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...
- Java开发之多线程下载和断点续传
代码实现了多线程下载和断点续传功能 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...
- 【Java】:多线程下载
import java.io.InputStream; import java.io.RandomAccessFile; import java.net.URL; import java.net.UR ...
- Android学习记录(6)—将java中的多线程下载移植到Android中(即多线程下载在Android中的使用)③
在这一节中,我们就来讲多线程下载以及断点续传在android中怎么使用,前两节是为本节做准备的,没有看前两节的同学,最好看完前面的两篇文章再来看这篇.其实在android端的应用和java基本上是差不 ...
- Java多线程下载文件
package com.test.download; import java.io.File; import java.io.InputStream; import java.io.RandomA ...
- Java_java多线程下载-断点下载-超详细
基本原理:利用URLConnection获取要下载文件的长度.头部等相关信息,并设置响应的头部信息.并且通过URLConnection获取输入流,将文件分成指定的块,每一块单独开辟一个线程完成数据的读 ...
- URL 多线程下载
该资源来源于李刚老师的疯狂JAVA讲义 InutStream openStream():打开与此URL链接,并返回一个用于读取该URL资源的InputStream. 提供的openStream()可以 ...
- 多线程下载图片,同步下载http://www.importnew.com/15731.html
package mutiDownload; import java.io.IOException; import java.io.InputStream; import java.io.RandomA ...
随机推荐
- Unreal Engine4 学习笔记1 状态机 动画蓝图
1.动画蓝图 包含 状态机 包含 混合空间BlendSpace,即状态机包含在动画蓝图的"动画图表中",而混合空间可用于在状态机中向某(没)一个状态输出最终POSE: 动画蓝 ...
- 攻城狮在路上(伍)How tomcat works(四)Tomcat的默认连接器
在第4章中将通过剖析Tomcat4的默认连接器的代码,讨论需要什么来创建一个真实的Tomcat连接器. 注意:本章中提及的“默认连接器”是指Tomcat4的默认连接器.即使默认的连机器已经被 ...
- Java Hour 66 Spring 相关
这章简单的来了解下Spring 和 Hibernate 是如何勾搭在一起的. <bean id="sessionFactory" class="org.spring ...
- maven web启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
问题描述 SEVERE: Error configuring application listener of class org.springframework.web.util.Log4jConfi ...
- CentOS安装中文支持
部分文档突然成乱码了. 解决方法: 1.安装中文支持包 # yum groupinstall "Chinese Support" 2 修改# /etc/sysconfig/i18n ...
- Codeforces Round #229 (Div. 2) C. Inna and Candy Boxes 树状数组s
C. Inna and Candy Boxes Inna loves sweets very much. She has n closed present boxes lines up in a ...
- 原生JavaScript 全特效微博发布面板效果实现
javaScript实现微博发布面板效果.---转载白超华 采用的js知识有: 正则表达式区分中英文字节.随机数生成等函数 淡入淡出.缓冲运动.闪动等动画函数 onfocus.onblur.oninp ...
- Arduino101学习笔记(六)—— 高级IO
1.位移输出函数(8位) 输入value数据后Arduino会自动把数据移动分配到8个并行输出端. 其中dataPin为连接DS的引脚号, clockPin为连接SH_CP的引脚号, bitOrder ...
- CF735C 数论\平衡树叶子节点的最大深度\贪心\斐波那契\条件归一化
http://codeforces.com/problemset/problem/735/C 题意..采用淘汰赛制..只要打输就退出比赛..而且只有两个选手打过的场数 相差不超过1才能比赛..最后问你 ...
- 【转】清理Kylin的中间存储数据(HDFS & HBase Tables)
http://blog.csdn.net/jiangshouzhuang/article/details/51290399 Kylin在创建cube过程中会在HDFS上生成中间数据.另外,当我们对cu ...