侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

HDFS的FileSystem接口详解

Allen Best
2022-04-05 / 0 评论 / 0 点赞 / 129 阅读 / 4,714 字
温馨提示:
本文最后更新于 2022-04-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Java抽象类org.apache.hadoop.fs.FileSystem定义了hadoop的一个文件系统接口。Hadoop中关于文件操作类基本上全部是在**"org.apache.hadoop.fs"**包中。
Hadoop类库中最终面向用户提供的接口类是FileSystem,该类是个抽象类,只能通过来类的get方法得到具体类。

构造方法

该类是一个抽象类,通过以下两种静态工厂方法可以过去FileSystem实例:

public staticFileSystem.get(Configuration conf) throws IOException

public staticFileSystem.get(URI uri, Configuration conf) throws IOException

Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://localhost:9000");
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);

具体方法实现

1、publicboolean mkdirs(Path f) throws IOException

一次性新建所有目录(包括父目录), f是完整的目录路径。

2、publicFSOutputStream create(Path f) throws IOException

创建指定path对象的一个文件,返回一个用于写入数据的输出流
create()有多个重载版本,允许我们指定是否强制覆盖已有的文件、文件备份数量、写入文件缓冲区大小、文件块大小以及文件权限。
3、publicboolean copyFromLocal(Path src, Path dst) throws IOException
将本地文件拷贝到文件系统

4、publicboolean exists(Path f) throws IOException
检查文件或目录是否存在

5、publicboolean delete(Path f, Boolean recursive)
永久性删除指定的文件或目录,如果f是一个空目录或者文件,那么recursive的值就会被忽略。只有recursive=true时,一个非空目录及其内容才会被删除。

6、FileStatus类封装了文件系统中文件和目录的元数据,包括文件长度、块大小、备份、修改时间、所有者以及权限信息。
通过"FileStatus.getPath()"可查看指定HDFS中某个目录下所有文件。

7、读取hdfs文件内容

FSDataInputStream getIt = fs.open(file);
BufferedReader d = new BufferedReader(new
InputStreamReader(getIt));
String content = d.readLine(); //读取文件一行

InputStreamReader这个对象是处理流,字符流,输入流;
BufferedReader的类型是缓冲处理流、字符流、输入流。
类 InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。如:GBK

每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如: BufferedReader in= new BufferedReader(new InputStreamReader(System.in));

System.in是个字节流

InputStreamReader是个字符流和字节流之间的转换中介

BufferedReader是个字符流
整体意思就是用InputStreamReader这个中介把System.in这个字节流转换成字符流BufferedReader
这样输入的时候就可以不是一个一个字节读,而是一个一个字符读,再加上是个Buffer,效率会高很多。

示例程序
1、上传文件

importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FileStatus;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;
  
public  class HdfsCopyFile {
     public  static  void  main(String[] args) throws  Exception {
         Configuration conf= new  Configuration();
         FileSystem hdfs=FileSystem.get(conf);
         //本地
         Path src =newPath( "D:\\abc.txt" );
         //HDFS
         Path dst = new  Path( "/" );
       
         hdfs.copyFromLocalFile(src, dst);
         System.out.println( "Uploadto" +conf.get( "fs.default.name" ));
       
         FileStatusfiles[]files=hdfs.listStatus(dst);
         for (FileStatus file:files){
             System.out.println(file.getPath());
         }
     }
}

2、创建HDFS目录

import  org.apache.hadoop.conf.Configuration;
import  org.apache.hadoop.fs.FileSystem;
import  org.apache.hadoop.fs.Path;
  
public  class  HdfsCreateDir {
  
     public  static  void  main(String[] args)  throws  Exception{
         Configuration conf= new  Configuration();
         FileSystem hdfs=FileSystem.get(conf);
         Path dfs= new  Path( "/TestDir" );
        
         hdfs.mkdirs(dfs);
  
     }
}

3、重命名HDFS文件

import  org.apache.hadoop.conf.Configuration;
import  org.apache.hadoop.fs.FileSystem;
import  org.apache.hadoop.fs.Path;
  
public  class  HdfsRename{
     public  static  void  main(String[] args)  throws  Exception {
         Configuration conf= new  Configuration();
         FileSystem hdfs=FileSystem.get(conf);
         Path frpaht= new  Path( "/test" );     //旧文件名
         Path topath= new  Path( "/test1" );     //新文件名
         boolean  isRename=hdfs.rename(frpaht, topath);
         String result=isRename? "成功" : "失败" ;
         System.out.println( "文件重命名结果为:" +result);
        
     }
}

4、删除HDFS上的文件 FileSystem.delete(Path f,Boolean recursive)
其中f为需要删除文件的完整路径,recuresive用来确定是否进行递归删除

import  org.apache.hadoop.conf.Configuration;
import  org.apache.hadoop.fs.FileSystem;
import  org.apache.hadoop.fs.Path;
  
public  class  HdfsDeleteFile {
  
     public  static  void  main(String[] args)  throws  Exception {
         Configuration conf= new  Configuration();
         FileSystem hdfs=FileSystem.get(conf);
         Path delef= new  Path( "/test1" );
         boolean  isDeleted=hdfs.delete(delef, false );
         //递归删除
         //boolean isDeleted=hdfs.delete(delef,true);
         System.out.println( "Delete?" +isDeleted);
     }
}

5、检查某个HDFS文件是否存在

import  org.apache.hadoop.conf.Configuration;
import  org.apache.hadoop.fs.FileSystem;
import  org.apache.hadoop.fs.Path;
  
public  class  HdfsCheckFile {
     public  static  void  main(String[] args)  throws  Exception {
         Configuration conf= new  Configuration();
         FileSystem hdfs=FileSystem.get(conf);
         Path findf= new  Path( "/test1" );

         boolean  isExists=hdfs.exists(findf);

         System.out.println( "Exist?" +isExists);
     }
}

补充说明:
关于BufferedReader的用法
从字符输入流中读取文本,缓冲字符,以便有效地读取字符、数组和行。

构造 函数

BufferedReader(Reader in)
创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建使用指定大小的输入缓冲区的缓冲字符输入流。

方法

public int read()
         throws IOException
读取单个字符。
字符读取为 0 到 65535(0x00-0xffff)范围内的整数,如果已到达流的末尾,则为 -1
public int read(char[] cbuf,
       int off,
       int len)
         throws IOException
参数:
cbuf- 目的地缓冲区
off- 开始存储字符的偏移量
len- 要读取的最大字符数
返回:
读取的字符数,如果已达到流的末尾,则为 -1
public String readLine()
                throws IOException
读取一行文本。
返回:
包含行内容(不包括任何行终止字符)的字符串,如果已到达流的末尾,则为 null
0

评论区