准备

使用Java API操作HDFS中文件主要涉及如下几个类:
1)Configuration类:该类的对象封装了客户端或者服务器的配置。
2)FileSystem 类:该类的对象是一个文件系统对象,可以用该对象的一些方法对文件进行操作。FileSystem fs = FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。
3)FSDatalnputStream FSDataOutputStream:这两个类是HDFS中的输入/输出流,分别通过FileSystem的open 方法和create方法获得。

代码实现

以下我们会通过实例代码来介绍如何利用Java API进行文件夹的创建、文件列表显示、文件上传的文件下载的操作。

1、创建Maven项目

我们基于Maven创建一个java项目,使用的archetype为maven-archetype-quickstart,在此不再赘述

2、添加依赖

我们在pom.xml中添加HDFS操作的相关依赖(依赖版本尽量与安装的hadoop版本一致),如下:

 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>3.2.1</version> </dependency> 

2、创建测试类

 import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; /** * <h3>hdfs</h3> * * @author panziye * @description <p></p> * @date 2021-04-22 12:30 **/ public class TestHDFS { //1.创建文件夹 public static void createFloder(){ //定义一个配置对象 Configuration conf = new Configuration(); try { //URI对象通过使用HDFS协议指定HDFS文件系统配置的节点地址,ip可换为主机映射名 URI uri = new URI("hdfs://192.168.55.100:9820"); //根据配置信息获取文件系统对象 FileSystem fs = FileSystem.get(uri, conf); //在指定路径下创建文件夹 Path path = new Path("/yunpan"); fs.mkdirs(path); } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //2.上传文件 public static void uploadFile(){ //定义一个配置对象 Configuration conf = new Configuration(); try { //URI对象 URI uri = new URI("hdfs://192.168.55.100:9820"); //根据配置信息获取文件系统对象 FileSystem fs = FileSystem.get(uri, conf); //定义文件的路径和上传路径 Path src = new Path("D://hello.txt"); Path dest = new Path("/yunpan/hello.txt"); //从本地上传到文件服务器上 fs.copyFromLocalFile(src,dest); } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //3.递归显示文件 public static void listFile(Path path){ //定义一个配置对象 Configuration conf = new Configuration(); try { //URI对象 URI uri = new URI("hdfs://192.168.55.100:9820"); //根据配置信息获取文件系统对象 FileSystem fs = FileSystem.get(uri, conf); // true 表示递归查找 ; false 表示不进行递归查找 RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(path, true); while (iterator.hasNext()){ LocatedFileStatus next = iterator.next(); System.out.println("当前文件路径是:"+next.getPath()); } System.out.println("-------------------------------------"); //将给定path路径下的所有文件元数据放到一个FileStatus的数组中 //FileStatus对象封装了文件和目录的元数据,包括文件长度、块大小、权限等 final FileStatus[] fileStatusArray = fs.listStatus(path); for (int i = 0; i < fileStatusArray.length; i++) { FileStatus fileStatus = fileStatusArray[i]; System.out.println(fileStatus.getPath()); } } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //4.下载文件 public static void downloadFile(){ //定义一个配置对象 Configuration conf = new Configuration(); try { //URI对象 URI uri = new URI("hdfs://192.168.55.100:9820"); //根据配置信息获取文件系统对象 FileSystem fs = FileSystem.get(uri, conf); //定义下载文件的路径和本地存放路径 Path src = new Path("/yunpan/hello.txt"); Path dest = new Path("E://hello.txt"); //从文件服务器下载到本地 fs.copyToLocalFile(src,dest); } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //main方法 public static void main(String[] args) { //设置操作用户 System.setProperty("HADOOP_USER_NAME","hadoop"); //1.创建新文件夹 //createFloder(); //2.上传文件 //uploadFile(); //3.递归显示文件 //listFile(new Path("/")); //4.下载文件 downloadFile(); } } 

注意:
1)如果报错org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator,请参考:

2)下载文件如果报错 java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset请参考: