HDFS之FileStatus

 任何文件系统的一个重要特性都是提供其目录结构浏览和检索它所存文件和目录相关信息的功能。FileStatus对象封装了文件系统中文件和目录的元数据,包括文件的长度、块大小、备份数、修改时间、所有者以及权限等信息。

  FileStatus对象由FileSystem的getFileStatus()方法获得,调用该方法的时候要把文件的Path传进去。

  例子:打印输出某个文件的所有信息

复制代码
 1 package com.hdfs;
 2 
 3 import org.apache.hadoop.conf.Configuration;
 4 import org.apache.hadoop.fs.FSDataInputStream;
 5 import org.apache.hadoop.fs.FSDataOutputStream;
 6 import org.apache.hadoop.fs.FileStatus;
 7 import org.apache.hadoop.fs.FileSystem;
 8 import org.apache.hadoop.fs.FileUtil;
 9 import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
10 import org.apache.hadoop.fs.Path;
11 import org.apache.hadoop.io.IOUtils;
12 import org.apache.hadoop.util.Progressable;
13 
14 public class HdfsTest1 {
15     //显示文件所有信息
16     public static void fileInfo(String path) throws IOException{
17         Configuration conf = new Configuration();
18         FileSystem fs = FileSystem.get(conf);
19         Path p = new Path(path);
20         //FileStatus对象封装了文件的和目录的额元数据,包括文件长度、块大小、权限等信息
21         FileStatus fileStatus = fs.getFileStatus(p);
22         System.out.println("文件路径:"+fileStatus.getPath());
23         System.out.println("块的大小:"+fileStatus.getBlockSize());
24         System.out.println("文件所有者:"+fileStatus.getOwner()+":"+fileStatus.getGroup());
25         System.out.println("文件权限:"+fileStatus.getPermission());
26         System.out.println("文件长度:"+fileStatus.getLen());
27         System.out.println("备份数:"+fileStatus.getReplication());
28         System.out.println("修改时间:"+fileStatus.getModificationTime());
29     }
30     public static void main(String[] args) throws IOException {
31         fileInfo("/user/hadoop/aa.mp4");
32     }
33 
34 }
复制代码

输出结果为:

文件路径:hdfs://master:9000/user/hadoop/aa.mp4
块的大小:67108864
文件所有者:hadoop:supergroup
文件权限:rw-r--r--
文件长度:76805248
备份数:3
修改时间:1371484526483


Hadoop中的FileStatus类可以用来查看HDFS中文件或者目录的元信息,任意的文件或者目录都可以拿到对应的FileStatus, 我们这里简单的演示下这个类的相关API:

 
 
  1. /*  
  2.  */ 
  3. package com.charles.hadoop.fs; 
  4.  
  5. import java.net.URI; 
  6. import java.sql.Timestamp; 
  7.  
  8. import org.apache.hadoop.conf.Configuration; 
  9. import org.apache.hadoop.fs.FileStatus; 
  10. import org.apache.hadoop.fs.FileSystem; 
  11. import org.apache.hadoop.fs.Path; 
  12.  
  13. /** 
  14.  * 
  15.  * Description:这个类演示如何通过FileSystem的getFileStatus()方法来获得FileStatus对象 
  16.  * 进而查询文件或者目录的元信息 
  17.  *  
  18.  * 我们这里做2个实验,依次是获取HDFS中的某文件的元信息,获取HDFS中某目录的元信息 
  19.  * 
  20.  * @author charles.wang 
  21.  * @created May 26, 2012 1:43:01 PM 
  22.  *  
  23.  */ 
  24. public class FileMetadataQuerier { 
  25.  
  26.     /** 
  27.      * @param args 
  28.      */ 
  29.     public static void main(String[] args) throws Exception { 
  30.         // TODO Auto-generated method stub 
  31.          
  32.          
  33.          
  34.         //读取hadoop文件系统的配置 
  35.         Configuration conf = new Configuration(); 
  36.         conf.set("hadoop.job.ugi""hadoop-user,hadoop-user"); 
  37.          
  38.         //实验1:查看HDFS中某文件的元信息 
  39.         System.out.println("实验1:查看HDFS中某文件的元信息"); 
  40.         String fileUri = args[0]; 
  41.         FileSystem fileFS = FileSystem.get(URI.create(fileUri) ,conf); 
  42.         FileStatus fileStatus = fileFS.getFileStatus(new Path(fileUri)); 
  43.         //获取这个文件的基本信息       
  44.         if(fileStatus.isDir()==false){ 
  45.             System.out.println("这是个文件"); 
  46.         } 
  47.         System.out.println("文件路径: "+fileStatus.getPath()); 
  48.         System.out.println("文件长度: "+fileStatus.getLen()); 
  49.         System.out.println("文件修改日期: "+new Timestamp (fileStatus.getModificationTime()).toString()); 
  50.         System.out.println("文件上次访问日期: "+new Timestamp(fileStatus.getAccessTime()).toString()); 
  51.         System.out.println("文件备份数: "+fileStatus.getReplication()); 
  52.         System.out.println("文件的块大小: "+fileStatus.getBlockSize()); 
  53.         System.out.println("文件所有者:  "+fileStatus.getOwner()); 
  54.         System.out.println("文件所在的分组: "+fileStatus.getGroup()); 
  55.         System.out.println("文件的 权限: "+fileStatus.getPermission().toString()); 
  56.         System.out.println(); 
  57.          
  58.         //实验2:查看HDFS中某文件的元信息 
  59.         System.out.println("实验2:查看HDFS中某目录的元信息"); 
  60.         String dirUri = args[1]; 
  61.         FileSystem dirFS = FileSystem.get(URI.create(dirUri) ,conf); 
  62.         FileStatus dirStatus = dirFS.getFileStatus(new Path(dirUri)); 
  63.         //获取这个目录的基本信息       
  64.         if(dirStatus.isDir()==true){ 
  65.             System.out.println("这是个目录"); 
  66.         } 
  67.         System.out.println("目录路径: "+dirStatus.getPath()); 
  68.         System.out.println("目录长度: "+dirStatus.getLen()); 
  69.         System.out.println("目录修改日期: "+new Timestamp (dirStatus.getModificationTime()).toString()); 
  70.         System.out.println("目录上次访问日期: "+new Timestamp(dirStatus.getAccessTime()).toString()); 
  71.         System.out.println("目录备份数: "+dirStatus.getReplication()); 
  72.         System.out.println("目录的块大小: "+dirStatus.getBlockSize()); 
  73.         System.out.println("目录所有者:  "+dirStatus.getOwner()); 
  74.         System.out.println("目录所在的分组: "+dirStatus.getGroup()); 
  75.         System.out.println("目录的 权限: "+dirStatus.getPermission().toString()); 
  76.         System.out.println("这个目录下包含以下文件或目录:"); 
  77.         for(FileStatus fs : dirFS.listStatus(new Path(dirUri))){ 
  78.             System.out.println(fs.getPath()); 
  79.         } 
  80.          
  81.          
  82.     } 
  83.  

最终显示结果为:

 
 
  1. 实验1:查看HDFS中某文件的元信息 
  2. 这是个文件 
  3. 文件路径: hdfs://192.168.129.35:9000/user/hadoop-user/textfile.txt 
  4. 文件长度: 93 
  5. 文件修改日期: 2012-05-26 12:49:04.285 
  6. 文件上次访问日期: 2012-05-26 12:49:04.285 
  7. 文件备份数: 1 
  8. 文件的块大小: 67108864 
  9. 文件所有者:  hadoop-user 
  10. 文件所在的分组: supergroup 
  11. 文件的 权限: rw-r--r-- 
  12.  
  13. 实验2:查看HDFS中某目录的元信息 
  14. 这是个目录 
  15. 目录路径: hdfs://192.168.129.35:9000/user/hadoop-user 
  16. 目录长度: 0 
  17. 目录修改日期: 2012-05-26 13:34:10.743 
  18. 目录上次访问日期: 1970-01-01 08:00:00.0 
  19. 目录备份数: 0 
  20. 目录的块大小: 0 
  21. 目录所有者:  hadoop-user 
  22. 目录所在的分组: supergroup 
  23. 目录的 权限: rwxr-xr-x 
  24. 这个目录下包含以下文件或目录: 
  25. hdfs://192.168.129.35:9000/user/hadoop-user/copyMe.txt 
  26. hdfs://192.168.129.35:9000/user/hadoop-user/input 
  27. hdfs://192.168.129.35:9000/user/hadoop-user/output 
  28. hdfs://192.168.129.35:9000/user/hadoop-user/textfile.txt 


/** Interface that represents the client side information for a file.
  * 对于一个hdfs中文件的表示类
 */
@InterfaceAudience.Public
@InterfaceStability.Stable
public class FileStatus implements Writable, Comparable {

  private Path path;   //路径
  private long length; //
  private boolean isdir; //是否是文件夹
  private short block_replication; //复制的份数
  private long blocksize;        
  private long modification_time;  //修改时间
  private long access_time;        //访问时间
  private FsPermission permission; //权限,如果没有被设置的话使用默认的
  private String owner;            //拥有者,可以被设置
  private String group;            //分组
  private Path symlink;             
  
  public FileStatus() { this(0, false, 0, 0, 0, 0, null, null, null, null); }........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你使用的是 `FileStatus` 类的 `getPath()` 方法获取文件路径,那么在 HDFS 中返回的路径格式应该是 `hdfs://<namenode>:<port>/<path>`,而在本地文件系统中返回的路径格式应该是 `file:///path` 或 `file:/path`。 如果你使用 `FileStatus` 类的 `getPath().toUri().getPath()` 方法获取文件路径,那么返回的路径将不包含 `hdfs://namenode:port` 或 `file://` 前缀,只包含文件路径本身。这是因为 `toUri().getPath()` 方法只返回 URI 的路径部分,并去掉了协议部分。 下面是一个示例代码,演示如何获取 HDFS 文件和本地文件的路径: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class FileStatusExample { public static void main(String[] args) throws IOException, URISyntaxException { // HDFS 文件路径 String hdfsPath = "hdfs://namenode:port/user/hadoop/example.txt"; // 本地文件路径 String localPath = "file:///home/user/example.txt"; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(new URI(hdfsPath), conf); // 获取 HDFS 文件状态 Path hdfsFile = new Path(hdfsPath); FileStatus hdfsStatus = fs.getFileStatus(hdfsFile); System.out.println("HDFS 文件路径:" + hdfsStatus.getPath()); // hdfs://namenode:port/user/hadoop/example.txt System.out.println("HDFS 文件路径(不包含前缀):" + hdfsStatus.getPath().toUri().getPath()); // /user/hadoop/example.txt // 获取本地文件状态 Path localFile = new Path(localPath); FileStatus localStatus = fs.getFileStatus(localFile); System.out.println("本地文件路径:" + localStatus.getPath()); // file:/home/user/example.txt System.out.println("本地文件路径(不包含前缀):" + localStatus.getPath().toUri().getPath()); // /home/user/example.txt fs.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值