欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java多线程下载文件原理解析

程序员文章站 2024-02-23 16:52:34
原理解析:利用randomaccessfile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同。根据线程的数量(假设有三个线程),服务器的文件三等分,并把我...

原理解析:利用randomaccessfile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同。根据线程的数量(假设有三个线程),服务器的文件三等分,并把我们在本地创建的文件同样三等分,每个线程下载自己负责的部分,到相应的位置即可。

示例图:

java多线程下载文件原理解析

示例demo

import java.io.inputstream;
import java.io.randomaccessfile;
import java.net.httpurlconnection;
import java.net.url;

public class mutildownload {
  private static string path = "http://192.168.80.85:8080/test.doc";
  private static final int threadcount = 3;

  public static void main(string[] args) {
    try {
      url url = new url(path);
      httpurlconnection conn = (httpurlconnection) url.openconnection();
      conn.setrequestmethod("get");
      conn.setconnecttimeout(5000);
      int responsecode = conn.getresponsecode();
      if (responsecode == 200) {
        int contentlength = conn.getcontentlength();
        system.out.println("length" + contentlength);

        randomaccessfile rafaccessfile = new randomaccessfile("test.doc", "rw");
        rafaccessfile.setlength(contentlength);

        int blocksize = contentlength / threadcount;
        for (int i = 0; i < threadcount; i++) {
          int startindex = i * blocksize; //每个现成下载的开始位置
          int endindex = (i + 1) * blocksize - 1;// 每个线程的结束位置
          if (i == threadcount - 1) {
            //最后一个线程
            endindex = contentlength - 1;
          }

          new downloadthread(startindex, endindex, i).start();
        }

      }
    } catch (exception e) {

    }
  }

  private static class downloadthread extends thread {
    private int startindex;
    private int endindex;
    private int threadid;

    public downloadthread(int startindex, int endindex, int threadid) {
      this.startindex = startindex;
      this.endindex = endindex;
      this.threadid = threadid;
    }

    @override
    public void run() {
      try {
        url url = new url(path);
        httpurlconnection conn = (httpurlconnection) url.openconnection();
        conn.setrequestmethod("get");
        conn.setconnecttimeout(5000);
        conn.setrequestproperty("range", "bytes=" + startindex + "-" + endindex); //固定写法,请求部分资源
        int responsecode = conn.getresponsecode(); // 206表示请求部分资源
        if (responsecode == 206) {
          randomaccessfile rafaccessfile = new randomaccessfile("test.doc", "rw");
          rafaccessfile.seek(startindex);
          inputstream is = conn.getinputstream();
          int len = -1;
          byte[] buffer = new byte[1024];
          while ((len = is.read(buffer)) != -1) {
            rafaccessfile.write(buffer, 0, len);
          }
          rafaccessfile.close();

          system.out.println("线程" + threadid + "下载完成");
        }
      } catch (exception e) {

      }
    }
  }
}

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