功能简介
咱们以前一直说流顺序的,不能随机访问,的确以前说的IO体系的确如此
可是 RandomAccessFile自成一派
此类的实例支持对随机访问文件的读取和写入
咱们以前介绍过DataOutput 和DataInput
这是两个接口,约定了从基本数据类型与字节的操做交互方式
因此,咱们从类层级结构也能够想获得
他必然是提供了便捷的读写基本数据类型的方法
构造方法
既然是文件随机读写,天然须要文件 内部维护了一个文件描述符 fd 还有文件的读写方式 rw |
|
明明只有两个构造方法 path的注释还说,若是经过文件描述符建立,path为null 此处提醒,有些注释或者API文档,他可能没及时删除,可能没及时修改,若是有的地方明显不太对劲 不要非去找证据证实他是对的,他可能就是错的,就看代码就行了,JDK的源码也是人写的,不是神丢向人间的 |
构造方法须要文件,以及读写模式这两个信息来打开文件
mode的字符串形式有以下几种,若是不对,能够看获得,若是这几种不是 imode为-1 小于0 直接抛异常了
"r" 以只读方式打开。调用结果对象的任何 write 方法都将致使抛出 IOException。
"rw" 打开以便读取和写入。若是该文件尚不存在,则尝试建立该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每一个更新都同步写入到底层存储设备。
"rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每一个更新都同步写入到底层存储设备。
|
|
构造方法中会打开文件 文件的打开使用的是本地方法 |
RandomAccessFile逻辑原理
RandomAccessFile仅仅只能用于文件
|
RandomAccessFile 对于文件的操纵,就好像是对于一个巨大的数组进行访问同样
存在着一种相似下标索引的东西,能够叫作文件指针
至于到底怎么抽象成这个模型的,底层的实现咱们不去关注,咱们只关注咱们看起来RandomAccessFile的样子就好
|
|
如上图所示,这就是RandomAccessFile访问文件的模型
能够返回这个文件的文件描述符 FileDescriptor getFD() 能够返回当前的文件指针 native long getFilePointer() 能够返回文件的长度 native long length() 还能够设置文件的长度 native void setLength(long newLength) 设置读写偏移量位置 void seek(long pos) |
setLength 为何还能设置文件长度? 你能够理解为这是一个"动态数组"!!
假设你想要设置为newLength 长度
1. 若是这个长度小于 实际长度(length方法返回的值), 文件被截断,而且若是getFilePointer 大于newLength ,那么它将变成newLength
2. 若是 newLength大于 实际长度(length方法返回的值),则该文件将被扩展 在此状况下,未定义文件扩展部分的内容。
seek方法设置的偏移量,下一次的读写将从这个位置开始
偏移量的设置可能会超出文件末尾,这并不会改变什么
可是一旦你在这个超出文件末尾的偏移量位置写入数据,长度将会改变
|
也正是此处的这几个方法提供了随机访问的能力 |
方法简介
RandomAccessFile的神秘之处就在于它的逻辑原理 那就是呈现给咱们的操做方式就像操做数组同样 他根本的读写方法,全都是本地方法 |
|
对于其余的readXXX 以及writeXXX方法则是借助于基本的读写方法的状况下, 提供了对基本数据类型的支持这一部分就至关于把DataInputStream和DataOutputStream结合起来了并且还可以随机存取再也不对readXXX和 writeXXX方法进行介绍若有兴趣能够对DataInput DataOutput 以及 DataInputStream和DataOutputStream 进行深刻研究 |