Hadoop中的FileStatus類可以用來檢視HDFS中檔案或者目錄的元資訊,任意的檔案或者目錄都可以拿到對應的FileStatus, 我們這裡簡單的示範下這個類的相關API:
- /*
- */
- package com.charles.hadoop.fs;
- import java.net.URI;
- import java.sql.Timestamp;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FileStatus;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- /**
- *
- * Description:這個類示範如何通過FileSystem的getFileStatus()方法來獲得FileStatus對象
- * 進而查詢檔案或者目錄的元資訊
- *
- * 我們這裡做2個實驗,依次是擷取HDFS中的某檔案的元資訊,擷取HDFS中某目錄的元資訊
- *
- * @author charles.wang
- * @created May 26, 2012 1:43:01 PM
- *
- */
- public class FileMetadataQuerier {
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //讀取hadoop檔案系統的配置
- Configuration conf = new Configuration();
- conf.set("hadoop.job.ugi", "hadoop-user,hadoop-user");
- //實驗1:檢視HDFS中某檔案的元資訊
- System.out.println("實驗1:檢視HDFS中某檔案的元資訊");
- String fileUri = args[0];
- FileSystem fileFS = FileSystem.get(URI.create(fileUri) ,conf);
- FileStatus fileStatus = fileFS.getFileStatus(new Path(fileUri));
- //擷取這個檔案的基本資訊
- if(fileStatus.isDir()==false){
- System.out.println("這是個檔案");
- }
- System.out.println("檔案路徑: "+fileStatus.getPath());
- System.out.println("檔案長度: "+fileStatus.getLen());
- System.out.println("檔案修改日期: "+new Timestamp (fileStatus.getModificationTime()).toString());
- System.out.println("檔案上次通路日期: "+new Timestamp(fileStatus.getAccessTime()).toString());
- System.out.println("檔案備份數: "+fileStatus.getReplication());
- System.out.println("檔案的塊大小: "+fileStatus.getBlockSize());
- System.out.println("檔案所有者: "+fileStatus.getOwner());
- System.out.println("檔案所在的分組: "+fileStatus.getGroup());
- System.out.println("檔案的 權限: "+fileStatus.getPermission().toString());
- System.out.println();
- //實驗2:檢視HDFS中某檔案的元資訊
- System.out.println("實驗2:檢視HDFS中某目錄的元資訊");
- String dirUri = args[1];
- FileSystem dirFS = FileSystem.get(URI.create(dirUri) ,conf);
- FileStatus dirStatus = dirFS.getFileStatus(new Path(dirUri));
- //擷取這個目錄的基本資訊
- if(dirStatus.isDir()==true){
- System.out.println("這是個目錄");
- }
- System.out.println("目錄路徑: "+dirStatus.getPath());
- System.out.println("目錄長度: "+dirStatus.getLen());
- System.out.println("目錄修改日期: "+new Timestamp (dirStatus.getModificationTime()).toString());
- System.out.println("目錄上次通路日期: "+new Timestamp(dirStatus.getAccessTime()).toString());
- System.out.println("目錄備份數: "+dirStatus.getReplication());
- System.out.println("目錄的塊大小: "+dirStatus.getBlockSize());
- System.out.println("目錄所有者: "+dirStatus.getOwner());
- System.out.println("目錄所在的分組: "+dirStatus.getGroup());
- System.out.println("目錄的 權限: "+dirStatus.getPermission().toString());
- System.out.println("這個目錄下包含以下檔案或目錄:");
- for(FileStatus fs : dirFS.listStatus(new Path(dirUri))){
- System.out.println(fs.getPath());
- }
- }
- }
最終顯示結果為:
- 實驗1:檢視HDFS中某檔案的元資訊
- 這是個檔案
- 檔案路徑: hdfs://192.168.129.35:9000/user/hadoop-user/textfile.txt
- 檔案長度: 93
- 檔案修改日期: 2012-05-26 12:49:04.285
- 檔案上次通路日期: 2012-05-26 12:49:04.285
- 檔案備份數: 1
- 檔案的塊大小: 67108864
- 檔案所有者: hadoop-user
- 檔案所在的分組: supergroup
- 檔案的 權限: rw-r--r--
- 實驗2:檢視HDFS中某目錄的元資訊
- 這是個目錄
- 目錄路徑: hdfs://192.168.129.35:9000/user/hadoop-user
- 目錄長度: 0
- 目錄修改日期: 2012-05-26 13:34:10.743
- 目錄上次通路日期: 1970-01-01 08:00:00.0
- 目錄備份數: 0
- 目錄的塊大小: 0
- 目錄所有者: hadoop-user
- 目錄所在的分組: supergroup
- 目錄的 權限: rwxr-xr-x
- 這個目錄下包含以下檔案或目錄:
- hdfs://192.168.129.35:9000/user/hadoop-user/copyMe.txt
- hdfs://192.168.129.35:9000/user/hadoop-user/input
- hdfs://192.168.129.35:9000/user/hadoop-user/output
- hdfs://192.168.129.35:9000/user/hadoop-user/textfile.txt
對于檔案,其檔案長度,備份數,修改日期,權限資訊符合真實情況:

而blocksize,因為我們說了HDFS中預設是64MB = 67108864 Byte
對于目錄,長度,備份數,塊大小都沒有語義,是以這裡都為0.