方式一:通过配置来获取fs对象
在 Java 中要想操作 HDFS,首先要获取一个客户端实例:
```Configurationconf=newConfiguration(); FileSystemfs=FileSystem.get(conf); ```
因为我们的操作目标是 HDFS,所以这里获取到的 fs 对象应该是 DistributedFileSystem 的实例。
那么,get 方法是从何处判断具体实例化哪种客户端类呢?
--从 conf 中的一个参数 `fs.defaultFS` 的配置值判断。
如果我们的代码中没有指定 `fs.defaultFS`,并且工程 classpath 下也没有给定相应的配置,conf 中的默认值就来自于 hadoop 的 jar 包中的 core-default.xml,默认值为file:///,此时获取的将不是一个 DistributedFileSystem 的实例,而是一个本地文件系统的客户端对象。
完整示例如下所示:
```packagecom.hongyaa.hdfs; importjava.io.IOException; importorg.apache.hadoop.conf.Configuration; importorg.apache.hadoop.fs.FileSystem; publicclassHDFSDemo { publicstaticvoidmain(String[] args) throwsIOException { Configurationconf=newConfiguration(); //如果我们没有给 conf 设置文件系统,那么 fileSystem 默认获取的是本地文件系统的一个实例//若是我们设置了“fs.defaultFS”参数,这表示获取的是该 URI 的文件系统的实例,就是我们需要的 HDFS 集群的一个 fs 对象conf.set("fs.defaultFS", "hdfs://localhost:9000"); FileSystemfs=FileSystem.get(conf); System.out.println(fs.getUri()); } } ```
方式二:直接获取fs对象
packagecom.xiaowang.hdfs; importjava.io.IOException; importjava.net.URI; importjava.net.URISyntaxException; importorg.apache.hadoop.conf.Configuration; importorg.apache.hadoop.fs.FileSystem; publicclassHDFSDemo { publicstaticvoidmain(String[] args) throwsInterruptedException, URISyntaxException, IOException { Configurationconf=newConfiguration(); // 不需要配置“fs.defaultFS”参数,直接传入URI和用户身份,最后一个参数是安装Hadoop集群的用户,我的是“root”FileSystemfs=FileSystem.get(newURI("hdfs://localhost:9000"), conf, "root"); System.out.println(fs.getUri()); } }