`
zsybupt
  • 浏览: 41570 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[转载]hadoop--FSDataInputStream(上)

 
阅读更多

以上为FSDataInputStream的继承结构图,他的定义为:

public class FSDataInputStreamextends DataInputStreamimplements , , CloseableFSDataInputStream的主要作用就是用DataInputStream包装了一个输入流,并且使用BufferedInputStream实现了对输入的缓冲。

该类继承了DataInputStream父类,实现了,, Closeable三个接口。

FSDataInputStream实现了和接口,从而使Hadoop中的文件输入流具有流式搜索和流式定位读取的功能。

我们看一下接口的定义:

package org.apache.hadoop.fs;

import java.io.*;

 

/** Stream that permits seeking. */

public interface Seekable {

  /**

    从指定文件的pos位置,对文件流向前搜索。

  */

  void seek(long pos) throws IOException;

  /**

   * 返回文件流中的当前偏移量

   */

  long getPos() throws IOException;

 

  /**在文件的另一个副本中的查找targetPos指定的位置,如果找到了targetPos的

   * 位置返回true,否则返回FALSE。

   */

  boolean seekToNewSource(long targetPos) throws IOException;

}

Seekable接口允许通过seek(long pos)方法在文件中进行定位,如果pos的值大于文件的长度,会出现IOException。此外,还可以通过getPos()方法返回当前位置相对于文件开头的偏移量。我们应用程序员一般不关心seekToNewSource(long targetPos)方法,此方法实现在文件的另一个副本中的查找targetPos指定的位置,如果找到了targetPos的位置返回true,否则返回FALSE。HDFS内部就通过这个方法实现当客户结点发生故障时为客户提供可靠的输入流。

 

FSDataInputStream也实现了接口,从而实现从指定位置读取一部分数据,该接口的定义如下:

public interfacePositionedReadable {

  /**

     该方法从文件的指定位置position向后读取最多length的字节,并将读取到的字节存储在buffer的指定偏移量offset位置上,该方法不会改变文件当前的偏移位置,并且是线程安全的。方法返回实际读取的字节数。

   */

  public int read(long position, byte[] buffer, int offset, int length)

    throws IOException;

 

  /**

   该方法从文件的指定位置position向后读取length的字节,并将读取到的字节存储在buffer的指定偏移量offset位置上,该方法不会改变文件当前的偏移位置,并且是线程安全的。该方法与上面方法的区别是:该方法读取的字节数是固定的就是length,而上面方法读取的字节数可能小于等于length。如果到达文件的末尾,则会抛出IOException

   */

  public void readFully(long position, byte[] buffer, int offset, int length)

    throws IOException;

 

  /**

   从文件的position位置开始读取长度为byte[] buffer长度的字节到字节数组buffer中。方法不会改变文件当前的偏移位置offset,并且是线程安全的。如果到达文件的末尾,则会抛出IOException。

   */

  public void readFully(long position, byte[] buffer) throws IOException;

}

 

以上的方法都是线程安全的,而且保持了文件的当前位置,它主要是通过Seekable接口来实现的,如:

Long oldPos=getPos();

Try{

Seek(position);

//读取数据

}finally{

Seek(oldPos);

}

我们需要牢记seek()的开销很大,我们使用时需要很慎重。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics