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 ...
随机推荐
- Implementing Navigation with UINavigationController
Implementing Navigation with UINavigationController Problem You would like to allow your users to mo ...
- C# 非UI线程对控件的控制
第一步:定义委托 public delegate void wei(string ss); 第二步:控制UI的方法 public void get1(string ss) { richTextBox1 ...
- 第一次尝试用 Live Writer 写博客
之前在官网上下载了最新版的Windows Live Writer,可是安装不了,就在其他网站下了一个试试,可以安装,不过却是2009年的版本,很不喜欢,我希望能体验最新版的,回头还得重新下个最新版的安 ...
- iOS中图片动画的三种模式及基本的代码实现
-(void)play { //第一种图片动画模式 头尾方式 //头尾方式 [UIView beginAnimations:nil context:nil];//动画开始 [UIView setAni ...
- ado.net增删改查操作
ado.net是数据库访问技术将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层最基础的数据库访问技术 使用ado.net对数据 ...
- 实现Web验证码图片-原理
实现验证码的基础 GDI+ graphics device interface plus的缩写,即图形设备接口.GDI+为开发者提供了一组实现与各种设备(具有图形化能力但不涉及图形细节的设备)进行交互 ...
- java 中 静态块的作用
(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...
- Android 编程下 ListView 的 HeaderView 和 FooterView 不可选择点击
在 ListView 里,HeaderView 和 FooterView 也占一行,与其他的 item 一样,可以点击,有索引,HeaderView 的索引为0.如果要使这两项不可点击,可以使用下面的 ...
- Codeforces Round #375 (Div. 2) - A
题目链接:http://codeforces.com/contest/723/problem/A 题意:在一维坐标下有3个人(坐标点).他们想选一个点使得他们3个到这个点的距离之和最小. 思路:水题. ...
- DSP using MATLAB 示例Example3.1 3.2 3.3
上代码: w = [0:1:500]*pi/500; % [0,pi] axis divided into 501 points. X = exp(j*w) ./ (exp(j*w) - 0.5*on ...