开篇
首先应该知道的是在正常情况下使用单线程下载和多线程下载结果是差不多的。所以通常情况下不一定要追求多线程下载使用简单有效的单线程可能会更好
正题
在开始多线程下载前得先得知下载文件的大小,如果在之前的流程中并没有告知文件大小则可以使用HTTP请求方法 HEAD,这个请求方法类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头,在头部中可以找到字段content-length就是文件大小了得知文件长度后应分割需要下载的起止位置以便之后使用。
以图片里的文件为例,多线程数为2,那么就可以将文件下载分割为0-57186和57187-114373。
有具体位置后就可以启动多线程发送网络请求,在网络请求中使用HTTP协议的头部标志Range,这个标志的使用方法是Range:bytes=start-end。
对应刚才的例子两个网络请求的头部分别就是Range:bytes=0-57186和Range:bytes=57187-114373
最后以Java实现举例。Java默认的FileOutputStream只能覆盖或者接入文件尾部所以不能实现同时在不同位置写入。可以使用RandomAccessFile这个类可以跳到到指定的位置写入数据
参考博客
HTTP 请求头 Range