一、从Hadoop URL 中读取数据
使用java.net.URL对象打开一个数据流
InputStream in = new URL("hdfs://host/path").openStream();
二、FileSystem 对象
取得FileSystem实例有两种静态方法:
(1)public static FileSystem get(Configuration conf)
//Configuration对象封装了一个客户端或服务器的配置,这是用类路径读取而来的
//返回默认文件系统(在conf/core-site.xml中设置,如果没有设置过,则是默认的本地文件系统)
(2)public static FileSystem get (URI uri,Configuration conf)
//参数URI指定URI方案及决定所用文件系统的权限,如果没有指定方案,则退回默认的文件系统
三、open()方法
public FSDataInputStream open(path f)
//该方法默认使用4kb的缓冲大小
public abstract FSDataInputStream open(Path f, int bufferSize)
//第二个参数指定缓冲大小
//open方法实际返回的是一个FSDataInputStream,这个类是java.io.DataInputStream的一个子类,支持随机访问,能从流中任意位置对其数据。
四、FSDataInputStream类实现了Seekable接口
Seekable接口允许在文件中定位seek()方法,提供一个查询方法,用于查询当前位置相对于文件开始处的偏移量getPos()。
seekToNewSource(long targetPos)在应用程序中并不常用,此方法用来切换到数据的另一个副本并在新的副本中找寻targetPos指定的位置。HDFS内部就采用这样的方法在数据节点故障时为客户端提供可靠的数据输入流。
五、FSDataInputStream类实现了PositionedReadable接口
public int read(long position,byte[] buffer,int offset,int length)
//read()方法指定position读取指定长度的字节放入缓冲区buffer的指定偏移量offset,返回值是读到的字节数。
public int readFully(long position,byte[] buffer,int offset,int length)
//该方法读出字节length指定的数据到buffer。
public int readFully(long position,byte[] buffer)
//只接受buffer字节数组的版本中,再读取buffer.length字节。
所有这些方法会保留文件当前位置并且是线程安全的,因此它们提供了在读取文件(可能是元数据)的主要部分时访问其他部分的便利方法。
注意,seek()是相对高开销的操作,需要慎重使用。
六、创建文件的方法
(1)public FSDataOutputStream create(Path f)
//该方法如果没有文件,就会自动创建文件路径,所以最好用exists()检查父目录是否存在。
hadoop.util中有个Progressable的接口中,有个progress()方法,可以被告知数据写入数据节点的进度。
public FSDataOutputStream append(Path f)
//该append()方法允许一个写入者打开已有文件并在其末尾写入数据。HDFS支持,但S3不支持。
七、创建目录
public boolean mkdirs(Path f)
八、文件元数据:Filestatus
(1)FileStatus类封装了文件系统镇南关文件的目录和元数据,包括文件长度、块大小、副本、修改时间、所有者以及许可信息。
(2)getFileStatus()提供了一个获取一个文件或目录的状态对象的方法。大家可以通过看源代码看看它的信息参数。
(3)listSatus()能够列出目录的内容。
(4)globStatus(Path pathPattern,PathFilter filter)使用通配符在一个表达式中核对多个文件。
(5)PathFilter对象 ,通配格式不是总能描述我们想要访问的文件集合。listStatus()和globStatus()方法提供了可选PathFilter对象,使我们可以通过编程方式控制匹配。
(6)delete(Path f,boolean recursive)永久性删除文件或目录。