作为多文件传输系统,文件的存储管理功能必然是少不了的,多文件表示要将某个工程下的多个文件整体传输,那么第一步需要一个类去表示该工程(或app等等):
即ResourceInfo:
public class ResourceInfo {
/**
* 编号前缀可以是APP名称、资源类型名称等等<br>
* 编号前缀也可以模仿URL的层次格式,说明更详细的信息,
* 同时避免命名冲突。<br>
*/
private String resourceHead;
/**
* 资源编号<br>
* 编号是由APP自行产生的,比如:视频文件编号等。
*/
private String id;
/**
* 资源简介
*/
private String introduce;
那么对应工程下的每一个文件就有其各自对应的路径、大小,名称等等属性,即ResourceFileInfo:
public class ResourceFileInfo {
/**
* 从0开始的连续文件编号
*/
private int fileNo;
/**
* 文件名称,含路径,但是,路径不含绝对根。<br>
* 路径是相对于绝对根的相对路径。
*/
private String fileName;
/**
* 文件长度。
*/
private long fileSize;
注意此处存的是相对于绝对根的相对路径,因为文件除了自身的结构是固定的,它存在位置不同,绝对路径也不同,此处只保存他自身相对于所处工程的路径,绝对根将在用于接、发时获取。
上述是用于存储工程、文件本身属性的类。
接下来引入文件分块的理论,因为传输使用TCP/IP协议,IP协议限制了IP报文最大长度为64k,这意味着若单次发送长度大于64k,IP协议会将其自动拆分发送,再在接收端重组,为了避免这样频繁的拆分、组装影响速率,需要将大文件去拆分为多个小于64k的小文件,本次采用32k缓冲区的方法。
既然将大文件拆分开来,那么每一段文件也都应该有其自身的属性,如:该片段属于哪个文件,属于该文件的哪个部分,大小多少,即FileSectionInfo:
public class FileSectionInfo {
public static final int FILE_SECTION_INFO_LEN = 20;
private int fileNo;
private long offset;
private long length;
默认长度为20,因为该类三个成员int,long,long组成,长度相加为4+8+8=20。
三个成员依次代表属于哪个文件,该片段在文件当中的偏移量,文件片段长度。
有了该文件分段后每段文件的属性,自然也该有该文件自身用于存储片段的东西,即ResourceFileSectionInfo:
public class ResourceFileSectionInfo {
private String resourceId;
private List<FileSectionInfo> fileSectionList;
private int index;
三个成员分别表示:该文件所属的工程id,该文件的所有文件片段集合,第三个成员用于方便去遍历该文件片段集合而产生的。