自己的缺陷:RandomAccessFile
RandomAccessFile用于包括了已知长度记录的文件,以便我们能用seek()从一笔记录移至另一条;然后读取或修改那些记录。各记录的长度并不必然沟通;只要知道它们有多大以及置于文件那里即可。
首先,我们有点难以相信RandomAccessFile不属于InputStream可能OutputStream分层布局的一部门。除了刚巧实现了DataInput以及DataOutput(这两者亦由DataInputStream和DataOutputStream实现)接口之外,它们与那些分层布局并无什么干系。它甚至没有用到现有InputStream或OutputStream类的成果——回收的是一个完全不相干的类。该类属于全新的设计,含有本身的全部(大大都为固有)要领。之所以要这样做,是因为RandomAccessFile拥有与其他IO范例完全差异的行为,因为我们可在一个文件里向前或向后移动。不管在哪种环境下,它都是独立运作的,作为Object的一个“直接担任人”利用。
从基础上说,RandomAccessFile雷同DataInputStream和DataOutputStream的连系利用。个中,getFilePointer()用于相识当前在文件的什么处所,seek()用于移至文件内的一个新所在,而length()用于判定文件的最大长度。另外,构建器要求利用另一个自变量(与C的fopen()完全一样),指出本身只是随机读("r"),照旧读写兼施("rw")。这里没有提供对“只写文件”的支持。也就是说,如果是从DataInputStream担任的,那么RandomAccessFile也有大概能很好地事情。
尚有更难搪塞的。很容易想象我们有时要在其他范例的数据流中搜索,好比一个ByteArrayInputStream,但搜索要领只有RandomAccessFile才会提供。尔后者只能针对文件才气操纵,不能针对数据流操纵。此时,BufferedInputStream确实答允我们标志一个位置(利用mark(),它的值容纳于单个内部变量中),并用reset()重设谁人位置。但这些做法都存在限制,并不是出格有用。