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
评论区