这篇文章主要介绍了java多线程实现文件下载功能的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
多线程下载文件的思路:
获取文件大小的方式是通过网络读取,getContentLength()即可获取到文件的大小,使用RandomAccessFile()支持随机访问
2.根据所准备的线程数据,计算每一个线程需要下载的文件的大小
上图显示下载400M的电影分4个线程下载,每一个线程分别下载各自数据段中的数据,第一个线程下载0-100M,第二个下载100M-200M之间的数据,依次类推。因此下载过程中需要记住的是的开始位置段和结束位置段,其实只需要开始位置就可以了,结束为止可以根据开始位置加上下载的大小来推断获取。
这个里面需要注意的是,要更新数据的写入位置seek(startIndex),逐段填满,不然会出现覆盖以前的数据。
package com.ldw.multilthreaddownload; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class Multidownload { static int ThreadCount = 3; //线程的个数 static String path = "http://192.168.0.102:8080/QQ.exe"; //确定下载地址 public static void main(String[] args) { // Todo Auto-generated method stub //发送get请求,请求这个地址的资源 try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); if(conn.getResponseCode() == 200){ //获取到请求资源文件的长度 int length = conn.getContentLength(); File file = new File("QQ.exe"); //创建随机存储文件 RandomAccessFile raf = new RandomAccessFile(file, "rwd"); //设置临时文件的大小 raf.setLength(length); //关闭raf raf.close(); //计算出每一个线程下载多少字节 int size = length / Multidownload.ThreadCount; for(int i = 0; i