1. package net.webjoy.jackluo.android_json;
  2.  
  3. /**
  4. * 1.http Range "bytes="+ start+end
  5. * 2.RandomAccessFile设置写入的位置
  6. * 3开启多线程下载
  7. *
  8. * Created by jackluo on 9/30/15.
  9. */
  10.  
  11. import android.os.Environment;
  12. import android.os.Handler;
  13. import android.os.Message;
  14.  
  15. import java.io.File;
  16. import java.io.IOException;
  17. import java.io.InputStream;
  18. import java.io.RandomAccessFile;
  19. import java.net.HttpURLConnection;
  20. import java.net.MalformedURLException;
  21. import java.net.URL;
  22. import java.util.concurrent.Executor;
  23. import java.util.concurrent.Executors;
  24.  
  25. /**
  26. * 多线程下载
  27. */
  28. public class DownLoad {
  29. //创建一个线程池 创建三个线程
  30. private Executor threadPool = Executors.newFixedThreadPool(3);
  31.  
  32. private Handler handler;
  33.  
  34. public DownLoad(Handler handler){
  35. this.handler = handler;
  36. }
  37.  
  38. //创建一个线程池对象
  39. static class DownLoadRunnable implements Runnable{
  40.  
  41. private String url;
  42. private String fileName;
  43. private long start ;//开始位置
  44. private long end;//结束位置
  45. private Handler handler;
  46. public DownLoadRunnable(String url,String fileName,long start,long end,Handler handler){
  47. this.url = url;
  48. this.fileName = fileName;
  49. this.start = start;
  50. this.end = end;
  51. this.handler = handler;
  52. }
  53.  
  54. @Override
  55. public void run() {
  56.  
  57. try {
  58. URL httpUrl = new URL(url);
  59. HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
  60. connection.setRequestMethod("GET");
  61. connection.setReadTimeout(5000);
  62. //设置下载位置 向服务器拿到指定的流信息
  63. connection.setRequestProperty("Range", "bytes=" + start + "-" + end);
  64. //创建一个文件 根据指定位置写入信息
  65. RandomAccessFile accessFile = new RandomAccessFile(new File(fileName),"rwx");
  66. accessFile.seek(start);//设置读写的位置
  67. InputStream inputStream = connection.getInputStream();
  68. byte[] b = new byte[1024*4];//设置缓冲区的大小存
  69. int len=0;
  70. while ((len = inputStream.read(b))!=-1){
  71. accessFile.write(b,0,len);
  72. }
  73. if (accessFile !=null){
  74. accessFile.close();
  75. }
  76. if (inputStream !=null){
  77. inputStream.close();
  78. }
  79. //给主线程发送一个消息
  80. Message message = new Message();
  81. message.what = 1;
  82. handler.sendMessage(message);
  83.  
  84. } catch (MalformedURLException e) {
  85. e.printStackTrace();
  86. } catch (IOException e) {
  87. e.printStackTrace();
  88. }
  89.  
  90. }
  91. }
  92.  
  93. public void downLoadFile(String url){
  94. try {
  95. URL httpUrl = new URL(url);
  96. HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
  97. connection.setRequestMethod("GET");
  98. connection.setReadTimeout(5000);
  99. int count = connection.getContentLength();//获取了图片的大小
  100. int block = count/3;
  101.  
  102. //算线程的启始位置
  103. String fileName = getFileName(url);
  104. File parent = Environment.getExternalStorageDirectory();
  105. File fileDownLoad = new File(parent,fileName);
  106. /**
  107. * 11 / 3 = 每个下载 3个字节3 还余出2个字节空间
  108. * 第一个线程 0-2
  109. * 第二个线程 3-5
  110. * 第三个线程 6-10
  111. *
  112. *
  113. */
  114. for (int i=0;i<3;i++){
  115. long start = i*block;
  116. long end = (i+1)*block -1;
  117. if (i==2){
  118. end = count;
  119. }
  120. DownLoadRunnable runnable = new DownLoadRunnable(url, fileDownLoad.getAbsolutePath(),start,end,handler);
  121. //提交任务
  122. threadPool.execute(runnable);
  123. }
  124.  
  125. } catch (MalformedURLException e) {
  126. e.printStackTrace();
  127. } catch (IOException e) {
  128. e.printStackTrace();
  129. }
  130. }
  131. /**
  132. * 获取 URL后缀名
  133. */
  134. public String getFileName(String url){
  135. return url.substring(url.lastIndexOf("/")+1);
  136. }
  137.  
  138. }
  1. package net.webjoy.jackluo.android_json;
  2.  
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.TextView;
  10.  
  11. public class DownLoadActivity extends AppCompatActivity {
  12.  
  13. private Button button;
  14. private TextView textView;
  15. private int count =1;
  16. private Handler handler = new Handler(){
  17.  
  18. @Override
  19. public void handleMessage(Message msg) {
  20. //super.handleMessage(msg);
  21. int result = msg.what;
  22. count +=result;
  23. if (count==3){
  24. textView.setText("download success");
  25. }
  26. }
  27. };
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.activity_down_load);
  32.  
  33. button = (Button) findViewById(R.id.downlad_btn);
  34. textView = (TextView) findViewById(R.id.textView);
  35. button.setOnClickListener(new View.OnClickListener() {
  36. @Override
  37. public void onClick(View v) {
  38.  
  39. new Thread(){
  40. @Override
  41. public void run() {
  42. DownLoad load = new DownLoad(handler);
  43. load.downLoadFile("http://news.jsyks.com/photo/img1a.xgo-img.com.cn/pics/737/736406.jpg");
  44. }
  45. }.start();
  46.  
  47. }
  48. });
  49. }
  50.  
  51. }

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. Implementing Navigation with UINavigationController

    Implementing Navigation with UINavigationController Problem You would like to allow your users to mo ...

  2. C# 非UI线程对控件的控制

    第一步:定义委托 public delegate void wei(string ss); 第二步:控制UI的方法 public void get1(string ss) { richTextBox1 ...

  3. 第一次尝试用 Live Writer 写博客

    之前在官网上下载了最新版的Windows Live Writer,可是安装不了,就在其他网站下了一个试试,可以安装,不过却是2009年的版本,很不喜欢,我希望能体验最新版的,回头还得重新下个最新版的安 ...

  4. iOS中图片动画的三种模式及基本的代码实现

    -(void)play { //第一种图片动画模式 头尾方式 //头尾方式 [UIView beginAnimations:nil context:nil];//动画开始 [UIView setAni ...

  5. ado.net增删改查操作

    ado.net是数据库访问技术将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层最基础的数据库访问技术 使用ado.net对数据 ...

  6. 实现Web验证码图片-原理

    实现验证码的基础 GDI+ graphics device interface plus的缩写,即图形设备接口.GDI+为开发者提供了一组实现与各种设备(具有图形化能力但不涉及图形细节的设备)进行交互 ...

  7. java 中 静态块的作用

    (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...

  8. Android 编程下 ListView 的 HeaderView 和 FooterView 不可选择点击

    在 ListView 里,HeaderView 和 FooterView 也占一行,与其他的 item 一样,可以点击,有索引,HeaderView 的索引为0.如果要使这两项不可点击,可以使用下面的 ...

  9. Codeforces Round #375 (Div. 2) - A

    题目链接:http://codeforces.com/contest/723/problem/A 题意:在一维坐标下有3个人(坐标点).他们想选一个点使得他们3个到这个点的距离之和最小. 思路:水题. ...

  10. 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 ...