RandomAccessFile

Exploring RandomAccessFile

构造方法:

RandomAccessFile(File file, String mode)
RandomAccessFile(String path, String mode)

其中,mode参数必须为"r","rw","rws","rwd"其中之一。

  • "r":以只读方式打开

  • "rw":读写方式打开

  • "rwd":当文件不存在的时候,会创建它。而且,每次内容的更新都是同步写入存储设备。

  • "res":与"rwd"类似,会同时将文件元数据写入

文件元数据是文件的信息,如长度,修改时间,而非文件内容。

"rwd""rws"确保任何对本地存储设备上文件的写入,都能正确写入,确保宕机时数据丢失(但是速度可能会慢一点)。但是对于非本地存储设备,是没有这种保证的。

这里是RandomAccessFile的常用方法:

Method Description
void close() 关闭文件,释放资源,而且不能再次被打开
FileDescriptor getFD() 获得该文件的文件描述对象
long getFilePointer() 获得文件位置指针,从0开始
long length() 文件长度
int read() 读取下一个字节,阻塞方法
int read(byte[] b) 读取b.length()长度的字节到b中
char readChar() 读取一个字符,阻塞
int readInt() 读取
void seek(long pos) 寻址
void setLength(long newLength) 根据文件长度,可能会截断或者延长
int skipBytes(int n) 跳过指定的字节数
void write(byte[] b) 将b写入文件
void write(int b) 将整数b的低八位写入文件
void writeChars(String s) 将字符串写入文件
void writeInt(int i) 写入整数

当一个文件被打开后,操作系统会潜在的创建一个系统独立的结构代表该文件。指向该结构的一个句柄就存储在java.io.FileDescriptor类中,通过getFD()方法得到该对象。

文件描述符具有几个特有的方法:

Method Description
void sync() 告诉操作系统将缓冲区的内容刷新到本地磁盘
boolean valid() 判断该文件描述符有效性

写入文件的数据实际上保存在操作系统的输出缓冲区之中。当缓冲区满了以后,系统再将这些内容写入本地磁盘。缓冲区可以提高写入的性能,因为它是写入内存中去的。

然而,当你以rwsrwd模式打开文件,这样是直接写入本地磁盘的,通常会比rw模式慢一点。有时候会有这样的场景,你以rw模式打开文件,但是你需要将文件立即写入磁盘,这时候文件描述符就派上用场了,调用sync方法就可以完成。

Using RandomAccessFile

我们可以用RandomAccessFile创建一个平面文件数据库,如csv就是这种数据库。

看源代码吧,这里就不贴了。

原文地址:https://www.cnblogs.com/xiaojintao/p/6358573.html