Java实现多线程断点下载

JAVA多线程断点下载原理如图:

代码如下:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL; 

public class MutileThreadDownload {
  /**
   * 线程的数量
   */
  private static int threadCount = 3; 

  /**
   * 每个下载区块的大小
   */
  private static long blocksize; 

  /**
   * 正在运行的线程的数量
   */
  private static int runningThreadCount; 

  /**
   * @param args
   * @throws Exception
   */
  public static void main(String[] args) throws Exception {
    // 服务器文件的路径
    String path = "http://192.168.1.100:8080/ff.exe";
    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setConnectTimeout(5000);
    int code = conn.getResponseCode();
    if (code == 200) {
      long size = conn.getContentLength();// 得到服务端返回的文件的大小
      System.out.println("服务器文件的大小:" + size);
      blocksize = size / threadCount;
      // 1.首先在本地创建一个大小跟服务器一模一样的空白文件。
      File file = new File("temp.exe");
      RandomAccessFile raf = new RandomAccessFile(file, "rw");
      raf.setLength(size);
      // 2.开启若干个子线程分别去下载对应的资源。
      runningThreadCount = threadCount;
      for (int i = 1; i <= threadCount; i++) {
        long startIndex = (i - 1) * blocksize;
        long endIndex = i * blocksize - 1;
        if (i == threadCount) {
          // 最后一个线程
          endIndex = size - 1;
        }
        System.out.println("开启线程:" + i + "下载的位置:" + startIndex + "~"
            + endIndex);
        new DownloadThread(path, i, startIndex, endIndex).start();
      }
    }
    conn.disconnect();
  } 

  private static class DownloadThread extends Thread {
    private int threadId;
    private long startIndex;
    private long endIndex;
    private String path; 

    public DownloadThread(String path, int threadId, long startIndex,
        long endIndex) {
      this.path = path;
      this.threadId = threadId;
      this.startIndex = startIndex;
      this.endIndex = endIndex;
    } 

    @Override
    public void run() {
      try {
        // 当前线程下载的总大小
        int total = 0;
        File positionFile = new File(threadId + ".txt");
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url
            .openConnection();
        conn.setRequestMethod("GET");
        // 接着从上一次的位置继续下载数据
        if (positionFile.exists() && positionFile.length() > 0) {// 判断是否有记录
          FileInputStream fis = new FileInputStream(positionFile);
          BufferedReader br = new BufferedReader(
              new InputStreamReader(fis));
          // 获取当前线程上次下载的总大小是多少
          String lasttotalstr = br.readLine();
          int lastTotal = Integer.valueOf(lasttotalstr);
          System.out.println("上次线程" + threadId + "下载的总大小:"
              + lastTotal);
          startIndex += lastTotal;
          total += lastTotal;// 加上上次下载的总大小。
          fis.close();
        } 

        conn.setRequestProperty("Range", "bytes=" + startIndex + "-"
            + endIndex);
        conn.setConnectTimeout(5000);
        int code = conn.getResponseCode();
        System.out.println("code=" + code);
        InputStream is = conn.getInputStream();
        File file = new File("temp.exe");
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        // 指定文件开始写的位置。
        raf.seek(startIndex);
        System.out.println("第" + threadId + "个线程:写文件的开始位置:"
            + String.valueOf(startIndex));
        int len = 0;
        byte[] buffer = new byte[512];
        while ((len = is.read(buffer)) != -1) {
          RandomAccessFile rf = new RandomAccessFile(positionFile,
              "rwd");
          raf.write(buffer, 0, len);
          total += len;
          rf.write(String.valueOf(total).getBytes());
          rf.close();
        }
        is.close();
        raf.close(); 

      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        // 只有所有的线程都下载完毕后 才可以删除记录文件。
        synchronized (MutileThreadDownload.class) {
          System.out.println("线程" + threadId + "下载完毕了");
          runningThreadCount--;
          if (runningThreadCount < 1) {
            System.out.println("所有的线程都工作完毕了。删除临时记录的文件");
            for (int i = 1; i <= threadCount; i++) {
              File f = new File(i + ".txt");
              System.out.println(f.delete());
            }
          }
        } 

      }
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Java实现多线程断点下载实例代码(下载过程中可以暂停)
  • Java中 URL实现断点下载
  • 使用java实现http多线程断点下载文件(二)
  • 使用java实现http多线程断点下载文件(一)
(0)

相关推荐

  • 使用java实现http多线程断点下载文件(二)

    下载工具我想没有几个人不会用的吧,前段时间比较无聊,花了点时间用java写了个简单的http多线程下载程序,纯粹是无聊才写的,只实现了几个简单的功能,而且也没写界面,今天正好也是一个无聊日,就拿来写篇文章,班门弄斧一下,觉得好给个掌声,不好也不要喷,谢谢! 我实现的这个http下载工具功能很简单,就是一个多线程以及一个断点恢复,当然下载是必不可少的.那么大概先整理一下要做的事情: 1.连接资源服务器,获取资源信息,创建文件 2.切分资源,多线程下载 3.断点恢复功能 4.下载速率统计 大概就这几

  • Java中 URL实现断点下载

    复制代码 代码如下: URL ur = new URL("http://localhost:8080/first/he.txt");HttpURLConnection conn = (HttpURLConnection) ur.openConnection();//URL.openConnection() -- >return URLCommection(直接子类HttpURLConnection)conn.setRequestProperty("Range"

  • 使用java实现http多线程断点下载文件(一)

    基本原理:利用URLConnection获取要下载文件的长度.头部等相关信息,并设置响应的头部信息.并且通过URLConnection获取输入流,将文件分成指定的块,每一块单独开辟一个线程完成数据的读取.写入.通过输入流读取下载文件的信息,然后将读取的信息用RandomAccessFile随机写入到本地文件中.同时,每个线程写入的数据都文件指针也就是写入数据的长度,需要保存在一个临时文件中.这样当本次下载没有完成的时候,下次下载的时候就从这个文件中读取上一次下载的文件长度,然后继续接着上一次的位

  • Java实现多线程断点下载实例代码(下载过程中可以暂停)

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配.不难理解,如果你线程多的话,那下载的越快. 现流行的下载软件都支持多线程,且支持中途暂停下载,再次开始时不会从头开始下载. 两种功能的实现步骤如下: (1)连接到下载资源文件时,首先判断资源文件大小,同步的在本地创建一个大小相同的临时文件用于存储下载数据. (2)根据线程数量确定每个线程所需下载的文

  • Java实现多线程断点下载

    JAVA多线程断点下载原理如图: 代码如下: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.n

  • Android实现多线程断点下载的方法

    本文实例讲述了Android实现多线程断点下载的方法.分享给大家供大家参考.具体实现方法如下: package cn.itcast.download; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt

  • android多线程断点下载-带进度条和百分比进度显示效果

    android多线程断点下载,带进度条和百分比显示,断点下载的临时数据保存到SD卡的文本文档中,建议可以保存到本地数据库中,这样可以提高存取效率,从而提高系统性能. 效果: 打开软件: 下载中: 下载完毕: 附代码如下: package com.yy.multiDownloadOfBreakPoint; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.R

  • Android入门:多线程断点下载详细介绍

    本案例在于实现文件的多线程断点下载,即文件在下载一部分中断后,可继续接着已有进度下载,并通过进度条显示进度.也就是说在文件开始下载的同时,自动创建每个线程的下载进度的本地文件,下载中断后,重新进入应用点击下载,程序检查有没有本地文件的存在,若存在,获取本地文件中的下载进度,继续进行下载.当下载完成后,自动删除本地文件. 一.多线程断点下载介绍 所谓的多线程断点下载就是利用多线程下载,并且可被中断,如果突然没电了,重启手机后可以继续下载,而不需要重新下载: 利用的技术有:SQLite存储各个线程的

  • iOS开发网络篇—实现大文件的多线程断点下载

    说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: #import "YYViewController.h" #import

  • Android原生实现多线程断点下载实例代码

    各位父老乡亲,我单汉三又回来了,今天为大家带来一个用原生的安卓写的多线程断点下载Demo. 通过本文你可以学习到: SQLite的基本使用,数据库的增删改查. Handler的消息处理与更新UI. Service(主要用于下载)的进阶与使用. 原生的json文件解析(多层嵌套). RandomAccessFile的基本使用,可以将文件分段. 基于HttpURLConnection的大文件下载. 上面内容结合,实现多线程,断点下载. Demo是在TV上运行的,图片显示的问题不要纠结了. 文件下载的

  • Android实现多线程断点下载

    目录 QDownload 1.如何使用 1.1.导入依赖 1.2.初始化下载组件 1.3.核心控制器DownloadManager 1.4.监听下载进度 1.5.下载相关的操作 1.6.应用市场apk下载的一个场景 总结 QDownload QDownload是基于Android平台实现的下载框架.API简洁易上手,只需5分钟即可实现一个多任务.多线程.断点下载的功能 支持功能如下: 支持多个下载任务同时下载单个任务支持开多个线程下载支持断点下载,在断网.进程被划掉可恢复下载自动校验服务器文件服

随机推荐