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() | 判断该文件描述符有效性 |
写入文件的数据实际上保存在操作系统的输出缓冲区之中。当缓冲区满了以后,系统再将这些内容写入本地磁盘。缓冲区可以提高写入的性能,因为它是写入内存中去的。
然而,当你以rws
或rwd
模式打开文件,这样是直接写入本地磁盘的,通常会比rw
模式慢一点。有时候会有这样的场景,你以rw
模式打开文件,但是你需要将文件立即写入磁盘,这时候文件描述符就派上用场了,调用sync
方法就可以完成。
Using RandomAccessFile
我们可以用RandomAccessFile
创建一个平面文件数据库,如csv就是这种数据库。
看源代码吧,这里就不贴了。