一、從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)永久性刪除文件或目錄。