首页 理论教育 FSDataInputStream类介绍与应用

FSDataInputStream类介绍与应用

时间:2023-06-24 理论教育 版权反馈
【摘要】:使用FSDataInputStream 类创建的对象不是标准的“java.io”对象,FSDataImputStream 类是继承于“java.io”中DataInputStream 接口的一个特殊类,使用该类可以对其进行Java 中基本的IO 流操作。下面给出使用FSDataInputStream 类将HDFS 上的文件拷贝到本机的程序,该程序借助了Hadoop 中的工具类IOUtils,该工具类提供了copyBytes方法,将HDFS 拷贝到本机的操作,HDFS 作为输入流,本机PC 作为输出流,如图3.16 所示。

FSDataInputStream类介绍与应用

使用FSDataInputStream 类创建的对象不是标准的“java.io”对象,FSDataImputStream 类是继承于“java.io”中DataInputStream 接口的一个特殊类,使用该类可以对其进行Java 中基本的IO 流操作。除此之外,它还实现了Seekable 和PositionedReadable 两个接口,使其具有流式搜索和流式定位读取的功能。以下是Seekable 接口源代码

Seek(long var1)方法可以通过参数Var1 在文件中进行定位,定位到Var1 的指定位置,如果Var1 的值大于文件的长度,会抛出IOException。GetPost()方法可以返回当前位置相对于文件开头位置的偏移量。需要注意的是:Seek()方法是一个相对高开销的操作,需要谨慎使用。建议用流数据来构建应用的访问方式(例如:MapReduce),而非执行大量Seek()方法。

PositionedReadable 接口的实现,提供了FSDataInputStream 类具有从指定位置读取一部分数据的功能,下面是PositionedReadable 接口的源代码:

read(long posttion,byte[]buffer,int offset,int length)方法是从文件的指定position 位置向后读取length 个字节,并将这些读取数据存储到buffer 的指定偏移位置offset 上,该方法不会改变文件当前的偏移位置且线程安全,该方法将返回实际读取字节数。

readFully(long position,byte[]buffer,int offset,int length)方法与前面的read 方法类似,唯一的区别是:该方法读取的字节数是固定的,就是length,而read 方法读取的字节数可能小于等于length。如果到文件末尾,则抛出IOException。

下面给出使用FSDataInputStream 类将HDFS 上的文件拷贝到本机的程序,该程序借助了Hadoop 中的工具类IOUtils,该工具类提供了copyBytes(InputStream in,OutPutStream out,Configuration conf)方法,将HDFS 拷贝到本机的操作,HDFS 作为输入流,本机PC 作为输出流,如图3.16 所示。

图3.16 HDFS 拷贝到本机流程

程序执行结束以后,在E 盘下多了一个“banzhang.txt”文件,该文件的内容与HDFS 中的内容相同。

下面给出使用Seek 方法的程序,本书只给出具体实现的方法,读者可以自己调用该方法实现。该程序使用Seek 方法将输入流进行重新定位,然后将内容重新输出两次,最后查看输出流的位置。其程序如下:(www.xing528.com)

运行程序后,可以发现通过使用Seek 函数对输入流重新定位到开始位置后,重新对HDFS中的文件进行的重新输出,其结果如下:

1.当前所在位置:0

2.输出内容:

hello hadoop

hello hdfs

3.此时所在位置:24

4.重新定位:……………………………………

获取当前位置:0

第二次内容输出:

hello hadoop

hello hdfs

获取当前位置:24

完成!

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈