2.2--RandomAccessFile实现类和它的关联类FileChannel

  我认为分析源码是程序设计的一个逆过程,重要的是分析的过程,而且要时不时地换位思考,别人为什么要这样设计,多给自己敲敲边鼓,是提出问题的源泉,有了问题就不怕找不到答案。现在已经大体知道FileChannel类是什么和被约定用来做什么,接下来对RandomAccessFile和FileChannel之间的关系进行思考和探讨。

  FileChannel类昨天大体了解了一下,它的使命是一个更一般读写和中断的“通道”。为可见字节、聚集字节、离散字节提供一个通道。

  DataInput接口的其一实现类RandomAccessFile,大致根据名字猜一下它是个什么“东西”,"随机存取文件",意思是文件名随机。接口图中显示,该类同时实现了DataInput和DataOutput、closeable三个接口,DataInput接口是这样一个角色:从输入流读取字节一些字节存储到缓冲数组中。DtaOutput的角色:读取那些基本数据类型或数组中的字节到输出流中。于是该类就是一个从流中存取字节的“东西”,也就是他是输入输出流的一个容器。

  下面就来探讨两个类的关系。在DataInput接口图中已经显示,它们是一对一的单向关联,也就是说这个RandomAccessFile包含FileChannel这样一个属性,查看源码会发现,RandomAccessFile类的那些读写方法中并没有调用FileChannel类的操作,而只是在getChannel和close方法 中调用了FileChannel类的操作,大体上是说Random类只是提供和关闭一个FileChannel对象。这个一对一单向关联的代码实现很简单,即把关联类声明为属性,即可。还有一点要注意,在接口图中只是把该两个类定性为更一般的关联关系,而没有说他们是聚合还是组合,那时因为仅仅从外在形式上看不出来,这要结合具体上下文才能得到答案。但是现在已经有答案了,他们是聚合关系:因为它们的生命周期不一致。当然,我这样判断的依据就是:两个类同生共死。虽然我目前还没有更高明的判断方法,虽然我可能对类的生命周期也不是那么透彻,但是我相信它们确实是聚合关系。

  暂时写到这里吧,关于类的生命周期、垃圾回收和类元素的内存机制,我想有必要思考和回顾一下了,因为相比RandomAccessFile和其另一个关联类FileDescriptor的关系就显得复杂和令人晕头转向,要在代码实现多关联,就要解决指针的指向问题,所以如果不理解这些东西,那肯定就不能透彻地理解何以代码非要这样写才算实现了双向关联。对我这样的初学者来说,这可能意味着要花去2、3天的时间去思考,再2、3天的时间去整理总结,到时我会就这一主题另起一篇随笔来专门探讨,下一篇随笔可能会既有图又有文字还有代码,噢!想想都令人心酸。

  PS.无论如何,还是要加油,最后,个人偏见:认认真真的态度下,吃透一种语法可能用不到一个月,吃透一种编程思想可能用不到半年,吃透数据结构和算法也可能不过是时间稍长一点。。。

原文地址:https://www.cnblogs.com/10000miles/p/7419751.html