我最近一直在尝试多线程,我编写了一个使用HTTPUrlConnection的Range请求属性下载文件的应用程序。我首先从标题中获取文件的长度,然后将其拆分为X个相等的部分,如果有剩余部分,我再分配一个线程来处理松弛。然后每个部分进入队列内的对象。然后多个线程访问队列中的每个任务并执行它,同时将每个部分下载到单独的文件中。
我加入文件的方式是问题。无论我使用Linux cat
还是Windows'copy /B
或type
,都会发现生成的文件在某种程度上无效。
使用AVI文件时,索引会中断,但重建后,AVI会正常播放。使用.rar文件winrar显示“意外的归档结束”,尽管文件正常提取。可能导致这种情况的原因。我确保在线程之间将其拆分时没有重叠的字节。
答案 0 :(得分:0)
您错误地将Range参数用于请求。结束索引用于读取最后一个字符包含,而您的算法会传递您不想要传输的第一个字符的索引。从作为end
参数传递给DownloadPart
的参数中减去1,你应该没问题:
list.add(new DownloadPart(pos, pos + pieceLen - 1, savePath, url, String.valueOf(ch)));
您还应该清理一些不必要的代码重复;您的第一个完整区块不需要与任何其他完整区块区别对待,这将简化您的代码。