任何文件系统的一个重要特性都是提供其目录结构浏览和检索它所存文件和目录相关信息的功能。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:
- /*
- */
- 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
/** 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); }........