基本思路:
文件归档,换句话就是把多个文件的字节存到一个文件中。为此我们必须定义存储格式,才能从包中把文件重新抽出来。
文件由文件名和内容组成。要想完整的还原文件,我们必须同时存下这两个东西,而文件名和内容的字节大小我们都是不知道的,为此我们必须要用固定大小的空间存储它们的大小。
存储格式
名称 | 大小(单位字节) |
---|---|
文件名大小(fileNameLen) | 1 |
文件名(fileName) | fileNameLen |
文件内容大小(fileContentLen) | 4 |
文件内容(fileContent) | fileContentLen |
代码实现
因为文件内容大小是4个字节(也就是int型),我们要把它存到文件,就要转化成字节数组。我们规定低位靠前,高位靠后。按照这种格式封装转换操作与一个基础类DataUtil中。
DataUtil代码
package util;
public class DataUtil {
public static byte[] int2bytes(int src) {
byte[] rt = new byte[4];
for(int i=0; i<4; ++i) {
rt[i] = (byte)(src>>(i*8));
}
return rt;
}
public static int bytes2int(byte[] src) {
int rt = 0;
for(int i=0; i<4; ++i) {
rt |= (src[i]&0xFF)<<(i*8);
//字节在进行移位运算时,首先会被转换成int类型,
//此时若字节的符号位为1,它前面就会补全1,比如:
//0x80在byte类型时是-128,而转换成int,它的值还是
//-128,即0xffffff80,而我们移位运算想要的是
//0x00000080,即前面补全0,跟我们拆时一致。为此,
//我们让它与0xFF相与,从0xffffff80变为0x00000080。
}
return rt;
}
}