Android多线程断点续传原理解析

在下载大文件的时候,我们往往要使用多线程断点续传,保证数据的完整性,首先说多线程,我们要多线程下载一个大文件,就有开启多个线程,多个connection,既然是一个文件分开几个线程来下载,那肯定就是一个线程下载一个部分,如果文件的大小是200M, 使用两个线程下载, 第一个线程下载1-100M, 第二个线程下载101-200M。
我们在请求的header里面设置

conn.setRequestProperty("Range", "bytes="+startPos+"-"+endPos);  

这里startPos是指从数据端的哪里开始,endPos是指数据端的结束
根据这样我们就知道,只要多个线程,按顺序指定好开始跟结束,就可以解决下载冲突的问题了。

如何写文件

byte[] buffer = new byte[1024];  
int offset = 0;   
RandomAccessFile threadFile = new RandomAccessFile(this.saveFile,"rwd");  
threadFile.seek(startPos);  
threadFile.write(buffer,0,offset);  

从上面代码可以看出,每个线程找到自己开始写的位置,就是seek(startPos)
这样就可以保证数据的完整性,也不会重复写入了

基本上多线程的原理就是这样,其实也很简单
那么我们接着说断点续传,断点续传其实也很简单,原理就是使用数据库保存上次每个线程下载的位置和长度
例如我开了两个线程T1,T2来下载一个文件,设文件总大小为1024M,那么就是每个线程下载512M
可是我的下载中断了,那么我下次启动线程的时候(继续下载),是不是应该要知道,我原来下载了多少呢
所以是这样的,每下载一点,就更新数据库的数据,

你可能感兴趣的:(Java)