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 ...
随机推荐
- 用CocoaPods做iOS程序的依赖管理(转摘)
转摘自:http://blog.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/ 文档更新说明 2012-1 ...
- 实时视频应用之QoS关键技术分析
转自:http://www.aiweibang.com/m/detail/104476372.html?from=p 随着WebRTC标准的逐步推广,实时音视频通讯技术受到越来越多公司和技术人员的关注 ...
- loj 1002(spfa变形)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25828 题意:求所有点到给定的目标顶点的路径上的权值的最大值的最小 ...
- js日期格式化
<html> <head> <script> function test(){ //Js获取当前日期时间及其它操作 var myDate = new Date(); ...
- 【spring】 <tx:annotation-driven /> 的理解 【转载的】
在使用SpringMvc的时候,配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx.mvc 等也能很直白的理解出来分别的作用.<tx: ...
- 如何将Android Studio项目提交(更新)到github
转载:http://blog.csdn.net/jinrall/article/details/45787477 前言 在写这篇文章之前首先我假设你已经安装了Android Studio 并已经会用A ...
- ViewPager的广告条轮播
首先布局 <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:androi ...
- 到程序集里取DLL
C:\Windows\assembly\gac_msil
- UVA - 11488 字典树
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 《DSP using MATLAB》示例Example4.9
收敛域在圆外,对应原始时间序列为右边序列. 上代码: b = 1; a = poly([0.9, 0.9, -0.9]); % compute the polynomials coefficients ...