首先来看一下多线程下载的原理。多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序“拼接”起来就构
成了完整的文件了。这样就大大提高了文件的下载效率。对于文件下载来说,多线程下载是必须要考虑的环节。
多线程下载大致可分为以下几个步骤:
一.获取服务器上的目标文件的大小
显然这一步是需要先访问一下网络,只需要获取到目标文件的总大小即可。目的是为了计算每个线程应该分配的下载任务。
二. 在本地创建一个跟原始文件同样大小的文件
在本地可以通过RandomAccessFile 创建一个跟目标文件同样大小的文件,该api 支持文件任意位置的读写操作。这样就给多线程下载提供了方便,每个线程只需在指定起始和结束脚标范围内写数据即可。
三.计算每个线程下载的起始位置和结束位置
我们可以把原始文件当成一个字节数组,每个线程只下载该“数组”的指定起始位置和指定结束位置之间的部分。在第一步中我们已经知道了“数组”的总长度。因此只要再知道总共开启的线程的个数就好计算每个线程要下载的范围了。每个线程需要下载的字节个数(blockSize)=总字节数(totalSize)/线程数(threadCount)。 假设给线程按照0,1,2,3...n 的方式依次进行编号,那么第n 个线程下载文件的范围为:
起始脚标startIndex=n*blockSize。
结束脚标endIndex=(n-1)*blockSize-1。
考虑到totalSize/threadCount 不一定能整除,因此对已最后一个线程应该特殊处理,最后一个线程的起始脚标计算公式不变,但是结束脚标为endIndex=totalSize-1即可。
四.开启多个子线程开始下载
在子线程中实现读流操作,将conn.getInputStream()读到RandomAccessFile中。

