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 仿迅雷多线程下载的更多相关文章

  1. Android学习记录(4)—在java中学习多线程下载的基本原理和基本用法①

    多线程下载在我们生活中非常常见,比如迅雷就是我们常用的多线程的下载工具,当然还有断点续传,断点续传我们在下一节来讲,android手机端下载文件时也可以用多线程下载,我们这里是在java中写一个测试, ...

  2. Android学习记录(5)—在java中学习多线程下载之断点续传②

    在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...

  3. Java开发之多线程下载和断点续传

    代码实现了多线程下载和断点续传功能 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...

  4. 【Java】:多线程下载

    import java.io.InputStream; import java.io.RandomAccessFile; import java.net.URL; import java.net.UR ...

  5. Android学习记录(6)—将java中的多线程下载移植到Android中(即多线程下载在Android中的使用)③

    在这一节中,我们就来讲多线程下载以及断点续传在android中怎么使用,前两节是为本节做准备的,没有看前两节的同学,最好看完前面的两篇文章再来看这篇.其实在android端的应用和java基本上是差不 ...

  6. Java多线程下载文件

    package com.test.download;   import java.io.File; import java.io.InputStream; import java.io.RandomA ...

  7. Java_java多线程下载-断点下载-超详细

    基本原理:利用URLConnection获取要下载文件的长度.头部等相关信息,并设置响应的头部信息.并且通过URLConnection获取输入流,将文件分成指定的块,每一块单独开辟一个线程完成数据的读 ...

  8. URL 多线程下载

    该资源来源于李刚老师的疯狂JAVA讲义 InutStream openStream():打开与此URL链接,并返回一个用于读取该URL资源的InputStream. 提供的openStream()可以 ...

  9. 多线程下载图片,同步下载http://www.importnew.com/15731.html

    package mutiDownload; import java.io.IOException; import java.io.InputStream; import java.io.RandomA ...

随机推荐

  1. C# XML操作

    一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...

  2. NSDate用法整理总结

    int main(int argc, const char * argv[]) { @autoreleasepool { NSDate *date=[NSDate date]; NSLog(@&quo ...

  3. JavaScrip入门(3)

    函数: var m2=function(){ console.log('2222'); } console.log(typeof(m2)); 输出结果:test.html:31 function js ...

  4. DSP using MATLAB 示例Example2.11

    上代码: b = [1]; a = [1, -1, 0.9]; n = [-20:120]; h = impz(b,a,n); set(gcf,'Color','white'); %subplot(2 ...

  5. WPF,解决Listbox,按住ListboxItem向下拖出Listbox,横向滚动条跑到最后。

    类似这种样式的控件,.,在横向滚动条隐藏的情况下有这样的问题.(横向滚动条显示的时候也会,,目前不知道怎么解决.) 因为这个控件偏移是利用ListBox的ItemsPanelTemplate模版里的S ...

  6. NOIP201103瑞士轮【B002】

    [B002]瑞士轮[B级]出自附中OJ————————————————————————————————————————————————————————————————————————————————— ...

  7. AWS S3 API实现文件上传下载

    http://blog.csdn.net/marvin198801/article/details/47662965

  8. android项目 在签名打包遇到的问题

    我在签名打包前,build success  ,可以把程序安装在手机上 然后签名打包的时候,build fail  ,原因采用了release 版本,因此这个时候在gradule build 添加下面 ...

  9. js jQuery笔记

    jQuery 1.几种获取子元素的方法及区别 children方法获得的仅仅是元素一下级的子元素,即:immediate children. find方法获得所有下级元素,即:descendants ...

  10. Unity 状态转化机器

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /** 有限状 ...