文件内容读取的代码可以分为三个大步骤。
1、获取文件系统
2、通过文件系统打开文件
3、将文件内容输出
public static void read(Path path) throws IOException{
FileSystem hdfs = HdfsUtils.getFilesystem(); //步骤 1
FSDataInputStream fsDataInputStream = hdfs.open(path); //步骤 2
IOUtils.copyBytes(fsDataInputStream, System.out, 4096,false); //步骤 3
}
接下来,我们来看一下每个步骤的详细过程
一、获取文件系统对象(FileSystem)
要从HDFS上读取文件,必须先得到一个FileSystem。HDFS本身就是一个文件系统,所以,我们得到一个文件系统后就可以对HDFS进行相关操作。获取文件系统的步骤可以分为以下2步。
1、读取配置文件。
2、获取文件系统。
读取配置文件:Configuration 类有三个构造器,无参数的构造器表示直接加载默认资源,也可以指定一个boolean参数来关闭加载默认值,或直接使用另外一个Configuration 对象来初始化。
package com.yq.common;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
public class HdfsUtils {
public static FileSystem getFilesystem(){
FileSystem hdfs=null;
Configuration conf=new Configuration();
try{
URI uri = new URI("hdfs://localhost:9000");
hdfs = FileSystem.get(uri,conf);
}
catch(Exception ex){
//
}
return hdfs;
}
}
二、打开文件
FSDataInputStream fsDataInputStream = hdfs.open(path);
打开文件其实就是创建一个文件输入流,跟踪文件系统的open方法,可以找到源码
public FSDataInputStream open(Path f) throws IOException {
return open(f, getConf().getInt("io.file.buffer.size", 4096));
}
再跟踪open方法,找到以下抽象方法。