- 写在前面的话
- 引言
- 第 1 章 对象入门
- 第 2 章 一切都是对象
- 第 3 章 控制程序流程
- 第 4 章 初始化和清除
- 第 5 章 隐藏实施过程
- 第 6 章 类再生
- 第 7 章 多形性
- 第 8 章 对象的容纳
- 第 9 章 违例差错控制
- 第 10 章 Java IO 系统
- 第 11 章 运行期类型鉴定
- 第 12 章 传递和返回对象
- 第 十三 章 创建窗口和程序片
- 第 14 章 多线程
- 第 15 章 网络编程
- 第 16 章 设计范式
- 第 17 章 项目
- 附录 A 使用非 JAVA 代码
- 附录 B 对比 C++和 Java
- 附录 C Java 编程规则
- 附录 D 性能
- 附录 E 关于垃圾收集的一些话
- 附录 F 推荐读物
10.3 本身的缺陷: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() 重设那个位置。但这些做法都存在限制,并不是特别有用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论