RandomAccessFile 适用于由大小已知的记录组成的文件,以便我们可以使用 seek()将
记录从一处转移到另一处,然后读取或者修改记录。文件中记录的大小不一定都相同,只要
我们能够确定那些记录有多大以及它们在文件中的位置即可。
最初,我们可能难以相信 RandomAccessFile 不是 InputStream 或者 OutputStream
继承层次结构中的一部分。除了实现了 DataInput 和 DataOutput 接口
(DataInputStream 和 DataOutputStream 也实现了这两个接口)之外,它和这两个继
承层次结构没有任何关联。它甚至不使用 InputStrean 和 OutputStream 类中已经存在
的任何功能。它是一个完全独立的类,从头开始编写其所有方法的类。这么做的原因是因为
RandomAccessFile 拥有和别的 I/O 类型本质不同的行为,因为我们可以在一个文件内向
前和向后移动。在任何情况下,它都是自我独立的,直接从 Object 衍生而来。
从本质上来说,RandomAccessFile 的工作方式类似于把 DataInputStream 和
DataOutStream 组合起来使用,其中方法 getFilePointer()用于查找当前所处的文件
位置,seek()用于在文件内移至新的位置, length()用于判断文件的最大尺寸。另外,
其构造器还需要第二参数(和 C 中的 fopen()相同)用来指示我们只是想随机读(“r”)
还是既读又写(“rw”)。它并不支持只写文件,这表明 RandomAccessFile 若是从
DataInputStrean 继承而来也可能会运行得很好。
只有 RandonAccessFile 支持搜寻方法,并且只适用于文件。BufferedInputStream 却
能允许标注(mark())位置(其值存储于内部某个简单变量内)和重新设定位置(reset
()),但这些功能很有限,不是非常有用。
在 JDK1.4 中,RandomAccessFile 的大多数功能但不是全部,由 nio 存储映射文件
记录从一处转移到另一处,然后读取或者修改记录。文件中记录的大小不一定都相同,只要
我们能够确定那些记录有多大以及它们在文件中的位置即可。
最初,我们可能难以相信 RandomAccessFile 不是 InputStream 或者 OutputStream
继承层次结构中的一部分。除了实现了 DataInput 和 DataOutput 接口
(DataInputStream 和 DataOutputStream 也实现了这两个接口)之外,它和这两个继
承层次结构没有任何关联。它甚至不使用 InputStrean 和 OutputStream 类中已经存在
的任何功能。它是一个完全独立的类,从头开始编写其所有方法的类。这么做的原因是因为
RandomAccessFile 拥有和别的 I/O 类型本质不同的行为,因为我们可以在一个文件内向
前和向后移动。在任何情况下,它都是自我独立的,直接从 Object 衍生而来。
从本质上来说,RandomAccessFile 的工作方式类似于把 DataInputStream 和
DataOutStream 组合起来使用,其中方法 getFilePointer()用于查找当前所处的文件
位置,seek()用于在文件内移至新的位置, length()用于判断文件的最大尺寸。另外,
其构造器还需要第二参数(和 C 中的 fopen()相同)用来指示我们只是想随机读(“r”)
还是既读又写(“rw”)。它并不支持只写文件,这表明 RandomAccessFile 若是从
DataInputStrean 继承而来也可能会运行得很好。
只有 RandonAccessFile 支持搜寻方法,并且只适用于文件。BufferedInputStream 却
能允许标注(mark())位置(其值存储于内部某个简单变量内)和重新设定位置(reset
()),但这些功能很有限,不是非常有用。
在 JDK1.4 中,RandomAccessFile 的大多数功能但不是全部,由 nio 存储映射文件
(memory-mapped file)所取代,本章稍后会讲述。