最近做一个小项目需要用到RandomAccessFile这个类 这里讲讲一些经验.
分为读写两部分:
读: 用到里面的Seek(); ReadInt(); ReadChar();
其中Seek是指定位当前文件流指针的位置.
好比如你的文件中都是Int类型的数据,如 1567 这里有四个 分别是1 5 6 7
你想直接读出5 就要Seek(4) 然后调用ReadInt()函数.
Ps: 真实文件中1567这四个数据不是这样简单排放的 这里只是简化.
这里Int Float类型都是4字节 所以Seek(4) Double类型是8字节 Char类型是2字节.
这里谈谈一个特殊类型 String
我往文件中写一个String的时候需要定长 所以先用一个StringBuffer来存储数据
如:
StringBuffer s = new StringBuffer(new String("Example"));
s.setLength(20); //定长为20
//然后写入到文件中.
这里一个定长为20意思是 s最多可以容纳20个char 而每个char的长度是2字节 所以不管s填充了多少个char.
这里s的长度就是40字节.
所以如果你文件中数据的排列是int string(写入时候定长20) double
你要读取double的数据 则需要Seek(44) (4+40).
而读取定长为20的string. 因为函数有限,只能这样.
StringBuffer tempString = new StringBuffer();
for (int j = 0; j < 20; ++j)
{
tempString.append(raf.readChar());
}
return tempString.toString().trim();
用1个StringBuffer先把字符一个一个加进来 再处理.
写方面相对简单,用到的函数是: Seek(); WriteChars(); WriteInt();
基本就是用Seek定位 然后调用对应的写函数即可.
不管是读还是写, 执行一个读写函数指针的位置都会移动到读或者写这个数据的后面.
如 Seek(0); ReadInt();
此时指针的位置就是4.
不管读还是写 Seek()函数 做好数据定位是关键.