深入理解线程与进程:基础知识、下载技巧及多线程下载与断点续传方法
Java--利用多线程下载和断点续传技术原理(RandomAccessFile)

一、基础知识 1、什么是线程?什么是流程?他们之间是什么关系?
可以参考之前的一篇文章:Java核心知识点学习-并发与并行的区别、进程与线程的区别、如何创建线程以及线程的四种状态、什么是线程定时器
简单来说,一个进程可以由多个线程组成,一个操作系统可以有多个进程,并且它们都可以同时工作。
2.什么是下载?如何使用多线程下载?如何断点续传?
广义上讲,您在屏幕上看到的任何不属于您本地计算机的内容都是通过“下载”获得的。狭义上,人们只将自定义下载文件本地磁盘存储位置的操作视为“下载”;
WEB下载方式分为两种:HTTP和FTP。它们分别是超文本传输协议和文件传输协议的缩写。它们是计算机之间交换数据的两种方式。最经典的下载方式,这种下载方式的原理很简单,就是用户通过两条规则(协议)与提供文件的服务器取得联系,将文件移动到自己的电脑上,从而实现下载功能。
多线程下载是指一个文件可以通过多个线程下载;而断点续传的传说是,当一个文件下载到一半时,由于某种原因,下载突然中断,比如电脑突然关机,那么当再次开机时,已经下载到一半的文件就不需要启动了结束,但继续下载;原理很简单:首先,当下载中断时,记住上次下载的位置,然后从这个位置继续下载。这种持续下载可以手动完成。程序运行时还可以自动识别并下载触发器。
3.什么是随机访问文件?
RandomAccessFile 的唯一父类是 Object,与其他流父类不同。它用于访问保存数据记录的文件,以便您可以使用seek()方法来访问记录并对其进行读写。这些记录的大小不必相同;但是,必须知道它们的大小和位置。
RandomAccessFile 的工作原理是将 DataInputStream 和 DataOutputStream 粘合在一起,再加上它自己的一些方法,例如用于定位的 getFilePointer()、用于在文件中移动的eek() 以及用于确定文件大小的 length()。另外,它的构造函数还有一个参数,指示是以只读模式(“r”)还是读写模式(“rw”)打开文件(与C的fopen()完全相同)。它不支持只写文件。从这一点来看,如果RandomAccessFile继承DataInputStream,可能会做得更好。
因此,本例中使用RandomAccessFile的seek来记住上次访问记录,然后从上次访问继续下载。
RandomAccess字面意思就是随机访问。这种理解很容易造成混乱。既然是随机的,那我们如何控制进度呢?
表示“随机”一词:
random [ 'rændəm ] adj. 随意的,任意,随机的,随机挑选的,任意随机的,胡乱任意的,随机性,任意的,胡乱的,随便的;(话等)信口乱说的;(人等)偶然碰到的,随意选择的,随便,无关紧要的,漫不经心的
可以看到它也有任意的意思,也就是说可以访问文件的任意位置,这就解释了为什么可以断点续传。
2、方案实施