RandomAccessFile
RandomAccessFile的惟一父类是Object,与其余流父类不一样。是用来访问那些保存数据记录的文件的,这样你就能够用seek( )方法来访问记录,并进行读写了。这些记录的大小没必要相同;可是其大小和位置必须是可知的。
RandomAccessFile居然会是不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口以外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系绝不相干,甚至都没有用InputStream和OutputStream已经准备好的功能;它是一个彻底独立的类,全部方法(绝大多数都只属于它本身)都是从零开始写的。这多是由于RandomAccessFile能在文件里面先后移动,因此它的行为与其它的I/O类有些根本性的不一样。总而言之,它是一个直接继承Object的,独立的类。
基本上,RandomAccessFile的工做方式是,把DataInputStream和DataOutputStream粘起来,再加上它本身的一些方法,好比定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )。此外,它的构造函数还要一个表示以只读方式("r"),仍是以读写方式("rw")打开文件的参数 (和C的fopen( )如出一辙)。它不支持只写文件,从这一点上看,假如RandomAccessFile继承了DataInputStream,它也许会干得更好。
只有RandomAccessFile才有seek方法,而这个方法也只适用于文件。BufferedInputStream有一个mark( )方法,你能够用它来设定标记(把结果保存在一个内部
变量里),而后再调用reset( )返回这个位置,可是它的功能太弱了,并且也不怎么实用。
RandomAccessFile的绝大多数功能,若是不是所有的话,已经被nio的"内存映射文件(memory-mapped files)"给取代了。 app
nio的"内存映射文件(memory-mapped files)"