Hadoop-0.20.0源代码分析(05)

以文件流作为一个切面,阅读Hadoop源代码org.apache.hadoop.fs包中源代码。关于流,分为输入流和输出流两种,下面也这样简单划分为两类进行阅读分析。

输入流类

与输入流相关的接口和类的继承层次关系如下所示:

FSDataInputStream类实现了Seekable与PositionedReadable接口,赋予了Hadoop文件系统中的文件输入流分别能够进行流式搜索与定位流式读取的语义。

Seekable接口定义如下:

Seekable 接口中定义的方法,都是基于文件流的位置进行操作的方法,使得在文件系统中或文件系统之间进行流式操作更加方便。

PositionedReadable接口定义如下:

PositionedReadable接口中定义了三个基于位置来进行流式读取的操作。

接着,FSDataInputStream类继承自DataInputStream类,并实现上述这两个接口,必须实现接口中定义的操作:

FSDataInputStream输入流类最显著的特征就是,能够基于流的位置而进行流式操作。

另外,在org.apache.hadoop.fs包中还定义了基于RAF(Random Access File)风格的输入流类,可以随机读取该流对象。继承关系如下所示:

首先看抽象的输入流类,实现的源代码如下所示:

 输出流类

与输出流相关的接口和类的继承层次关系如下所示:

FSDataOutputStream输出流类内部实现了一个基于位置的缓冲输出流类PositionCache,该类的实现如下所示:

创建一个PositionCache缓冲流对象以后,可以向该文件输出缓冲流中写入相关的数据,作为缓冲使用,其中相关数据包括:文件系统(FileSystem)统计信息FileSystem.Statistics、当前待写入流的位置。每当需要向文件系统中写入数据,都会从PositionCache缓冲流中获取到一个写入位置(也就是,要从流中的该位置开始写入)。

FSDataOutputStream输出流类的通过一个PositionCache缓冲流来构造一个FSDataOutputStream输出流对象:

实例化FSDataOutputStream类,能够获取到当前用于要写入数据的流对象,也就是该类包装的输出流类OutputStream类型属性wrappedStream,其中wrappedStream就是一个OutputStream。

基于上面构造方法,缺省设置一些参数,得到如下两个重载的构造方法:

该FSDataOutputStream类实现的方法如下所示:

其中,sync方法表示实现同步流缓冲区的操作,使得缓冲的流对象与原始输出流对象同步,保证写入数据的正确性。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值