首页 > 编程 > Java > 正文

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

2019-11-26 09:04:36
字体:
来源:转载
供稿:网友

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

示例图:

示例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) {      }    }  }}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表