RandomAccessFile 类
是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法。RandomAccessFile 类支持“随机访问”方式,可以跳转到文件的任意位置处读写数据。在要访问一个文件的时候,不想把文件从头读到尾,而是希望像访问一个数据库一样地访问一个文本文件,这时,使用RandomAccessFile类就是最佳选择。
RandomAccessFile 对象类有个位置指示器,指向当前读写处的位置,当读写n个字节后,文件指示器将指向这n个字节后的下一个字节处。刚打开文件时,文件指示器指向文件的开头处,可以移动文件指示器到新的位置,随后的读写操作将从新的位置开始。RandomAccessFile在数据等长记录格式文件的随机(相对顺序而言)读取时有很大的优势,但该类仅限于操作文件,不能访问其它的IO 设备,如网络、内存映像等。以读写的方式打开一个文件时,如果文件不存在,程序会自动创建此文件。
RandomAccessFile类中的常用方法:
void close(); 关闭此随机访问文件流并释放与该流关联的所有系统资源。
long getFilePointer(); 返回此文件中的当前偏移量。
long length(); 返回此文件的长度。
read函数集 从文件读
void seek(long pos); 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
int skipBytes(int n) 尝试跳过输入的 n 个字节以丢弃跳过的字节。
write函数集 往文件写
setLength(long newLength) 设置文件大小(设置临时文件)
RandomAccessFile 类的构造方法
1. new RandomAccessFile(f, "rw"); // 读写方式
2. new RandomAccessFile(f, "r"); // 只读方式
向文件中记忆写入数据
File file = new File("accessFile");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
// 以下向 raf 文件中写数据
raf.writeInt(20);// 占4个字节
raf.writeDouble(8.236598);// 占8个字节
raf.writeShort(395);// 占2个字节
raf.writeUTF("这是一个UTF字符串");// 这个长度写在当前字符串指针的前两个字节处,可用readShort()读取
raf.writeBoolean(true);// 占1个字节
raf.writeLong(2325451l);// 占8个字节
raf.writeUTF("又是一个UTF字符串哈哈");
raf.writeFloat(35.5f);// 占4个字节
raf.writeChar('a');// 占2个字节
raf.close();
从文件中读取随机记忆的文件内容
File file = new File("accessFile");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
System.out.println(raf.readInt());//读取Int数据,指针会往后移动4字节
System.out.println(raf.readDouble());//读取Double数据,指针会往后移动8字节
System.out.println(raf.readUTF());//读取字符串,指针会移到该字符串后
raf.skipBytes(3);//跳过3个字节,也就是跳过上面例子的 boolen 和 short 值。
System.out.println(raf.readLong());//读取long值
short readShort = raf.readShort();//读取字符串的长度
System.out.println("目前指针处的字符串长度为=" + readShort);
raf.skipBytes(readShort);//跳过该字符串
System.out.println(raf.readFloat());//读取float值
System.out.println(raf.readChar());//读取char值
//long length = raf.length();
//System.out.println("文件的总字节数为:"+length);
//long filePointer = raf.getFilePointer();//当前指针的位置,定位到哪个字节了。
//System.out.println("目前字节指针定位在:"+filePointer);
//raf.seek(4);//直接定位到第4个字节处。