Java 随机读写文件RandomoAccessFile的使用
最近使用到了文件的随机读写类,也就是RandomAccessFile。
在逆序读取文件时,掉入坑中,查了好久才查明白逆序读取文件的显示不正确的问题,因此记录下。
这里以将十个Double类型数据写入文件,然后逆序输出为例演示该类文件指针使用
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;
public class DemoRandomAccessFile {
public static void main(String[] args) throws IOException {
String path = "test.dat";
Random r = new Random();
double[] d = new double[10];
for (int i = 0; i < 10; i++) {
d[i] = r.nextDouble();
}
RandomAccessFile raf = new RandomAccessFile(path,"rw");
for (int i = 0; i < 10; i++) {
raf.writeDouble(d[i]);
}
for (double db : d) {
System.out.println(db);
/* 0.36459323432361446
0.13651940344135172
0.1357858684349551
0.986897135757788
0.6429077333126798
0.11816239217768054
0.2629313455111566
0.5609890714675904
0.9400164982402917
0.7150820443699015*/
}
raf.close();
RandomAccessFile raf2 = new RandomAccessFile(path,"r");
for (int i = 72; i >= 0; i-=8) {
//移动文件指针
raf2.seek(i);
double v = raf2.readDouble();
System.out.println(v);
/*
0.7150820443699015
0.9400164982402917
0.5609890714675904
0.2629313455111566
0.11816239217768054
0.6429077333126798
0.986897135757788
0.1357858684349551
0.13651940344135172
0.36459323432361446
*/
}
}
}
从上文可以看出,在逆序读取时文件指针每次移动的8位,而并非我们所想的一位,实际上在API文档中介绍seek移动的是字节数而并非字符数。也就是说我们向文件中写入十个Double类型数据,我们每次将文件指针移动8位才能得到原始写入数据。同理如果是int就移动4位,字符就移动2位。
如果只移动一位就会出现如下不可预料情况
for (int i = 9; i >=0 ; i--) {
raf2.seek(i);
System.out.println(raf2.readDouble());
}
/*
-2.670493640028405E7
0.13651940344135172
-6.0109953501611854E-269
-5.888483400833804E84
2.787235138627022E235
-1.9558922176622E137
1.218978074109591E303
6.912097856429352E103
-5.169481444862979E112
0.36459323432361446
*/
因此使用seek移动文件指针时需要知道数据写入格式、顺序和类型