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 ...
随机推荐
- Oracle 备份与恢复介绍
一.Oracle备份方式分类:Oracle有两类备份方式:(1)物理备份:是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带.物理备份又分为冷备份.热备份: (2)逻 ...
- android 入门-微博分享
[2015-03-11 13:40:32 - WeiboSDK] Unable to resolve target 'android-8' 修改project.properties target=a ...
- hdu 4035 2011成都赛区网络赛E 概率dp ****
太吊了,反正我不会 /* HDU 4035 dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点 ...
- BZOJ 1861: [Zjoi2006]Book 书架 splay
1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书 ...
- 友盟页面统计 - 关于Viewpager中的Fragment的生命周期
Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的,在此不表: Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity ...
- Liferay 6.2 改造系列之十:修改系统登录相关配置
1.关闭自动登录功能: 在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Set this to true to allo ...
- IOS的Safari浏览器中,点击事件失效的原理及解决办法
这里做了事件委托,简单区分一下[目标元素]和[代理元素],为后续论述理解做铺垫. [目标元素]:实际希望点击的元素,可以是任意标签. [代理元素]:代替[目标元素]触发点击事件的元素,有可能是目标元素 ...
- 后缀数组 POJ 2406 Power Strings
题目链接 题意:连续重复子串.给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的(L = S^R ), 求 R 的最大值. 分析:枚举长度,判断条件是能被总长度整除且LCP ( ...
- Android客户端性能测试(一):使用APT测试Android应用性能
一.APT介绍: APT:Android Performance Testing Tools,适用于开发自测和定位性能瓶颈,帮助测试人员完成[性能基准测试.竞品测试]. APT提供了CPU利用率实时曲 ...
- Bower In ASP.NET Core
创建一个ASP.NET Core MVC项目的时候,会产生一个bower.json的文件,用于管理前段的js. NPM & Bower NPM主要运用于Node.js项目的内部依赖包管理,安装 ...