Java API操作HDFS方法详细讲解
作者:X_Serendipity
这篇文章主要介绍了Java API操作Hdfs详细示例,遍历当前目录下所有文件与文件夹,可以使用listStatus方法实现上述需求,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
一、判断Path指向目录还是文件
在net.xxr.hdfs
包里创建PathToFileOrDir
类
package net.xxr.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; /** * 功能:判断路径指向目录还是文件 */ public class PathToFileOrDir { public static void main(String[] args) throws Exception { // 创建配置对象 Configuration conf = new Configuration(); // 设置数据节点主机名属性 conf.set("dfs.client.use.datanode.hostname", "true"); // 定义uri字符串 String uri = "hdfs://master:9000"; // 创建文件系统对象 FileSystem fs = FileSystem.get(new URI(uri), conf, "root"); // 创建路径对象,指向目录 Path path1 = new Path("/ied01"); if (fs.isDirectory(path1)) { System.out.println("[" + path1 + "]指向的是目录!"); } else { System.out.println("[" + path1 + "]指向的是文件!"); } // 创建路径对象,指向文件 Path path2 = new Path("/lzy01/test2.txt"); if (fs.isFile(path2)) { System.out.println("[" + path2 + "]指向的是文件!"); } else { System.out.println("[" + path2 + "]指向的是目录!"); } } }
结果
二、删除目录或文件
在net.xxr.hdfs
包里创建DeleteFileOrDir
类
1、删除文件
- 删除
/lzy/hello.txt
文件 - 编写
deleteFile()
方法
package net.xxr.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.junit.Test; import java.net.URI; /** * 功能:删除目录或文件 */ public class DeleteFileOrDir { @Test public void deleteFile() throws Exception { // 创建配置对象 Configuration conf = new Configuration(); // 设置数据节点主机名属性 conf.set("dfs.client.use.datanode.hostname", "true"); // 定义uri字符串 String uri = "hdfs://master:9000"; // 创建文件系统对象 FileSystem fs = FileSystem.get(new URI(uri), conf, "root"); // 创建路径对象(指向文件) Path path = new Path(uri + "/lzy01/hello.txt"); // 删除路径对象指向的文件(第二个参数表明是否递归,删除文件,不用递归) boolean result = fs.delete(path, false); // 根据返回结果提示用户 if (result) { System.out.println("文件[" + path + "]删除成功!"); } else { System.out.println("文件[" + path + "]删除失败!"); } } }
结果
利用Hadoop WebUI界面查看
再运行deleteFile()
测试方法,查看结果
可以在删除文件之前,判断文件是否存在,需要修改代码
package net.xxr.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.junit.Test; import java.net.URI; /** * 功能:删除目录或文件 */ public class DeleteFileOrDir { @Test public void deleteFile() throws Exception { // 创建配置对象 Configuration conf = new Configuration(); // 设置数据节点主机名属性 conf.set("dfs.client.use.datanode.hostname", "true"); // 定义uri字符串 String uri = "hdfs://master:9000"; // 创建文件系统对象 FileSystem fs = FileSystem.get(new URI(uri), conf, "root"); // 创建路径对象(指向文件) Path path = new Path(uri + "/lzy01/hi.txt"); // 判断路径对象指向的文件是否存在 if (fs.exists(path)) { // 删除路径对象指向的文件(第二个参数表明是否递归,删除文件,不用递归) boolean result = fs.delete(path, false); // 根据返回结果提示用户 if (result) { System.out.println("文件[" + path + "]删除成功!"); } else { System.out.println("文件[" + path + "]删除失败!"); } } else { System.out.println("文件[" + path + "]不存在!"); } } }
结果
2、删除目录
- 删除
/ied01
目录 - 编写
deleteDir()
方法
@Test public void deleteDir() throws Exception { // 创建配置对象 Configuration conf = new Configuration(); // 设置数据节点主机名属性 conf.set("dfs.client.use.datanode.hostname", "true"); // 定义uri字符串 String uri = "hdfs://master:9000"; // 创建文件系统对象 FileSystem fs = FileSystem.get(new URI(uri), conf, "root"); // 创建路径对象(指向目录) Path path = new Path(uri + "/ied01"); // 判断路径对象指向的目录否存在 if (fs.exists(path)) { // 删除路径对象指向的目录(第二个参数表明是否递归,删除文件,要递归) boolean result = fs.delete(path, true); // 根据返回结果提示用户 if (result) { System.out.println("目录[" + path + "]删除成功!"); } else { System.out.println("目录[" + path + "]删除失败!"); } } else { System.out.println("目录[" + path + "]不存在!"); } }
再运行deleteDir()
方法,查看结果
3、删除目录或文件
- 进行三个层面的判断:判断类型(目录或文件)、判断是否存在、判断删除是否成功
- 删除
/ied03/exam.txt
文件和/ied02
目录 - 编写
delete()
方法
@Test public void delete() throws Exception { // 创建配置对象 Configuration conf = new Configuration(); // 设置数据节点主机名属性 conf.set("dfs.client.use.datanode.hostname", "true"); // 定义uri字符串 String uri = "hdfs://master:9000"; // 创建文件系统对象 FileSystem fs = FileSystem.get(new URI(uri), conf, "root"); // 定义随机对象 Random random = new Random(); // 产生随机整数 - [0, 1] int choice = random.nextInt(100) % 2; // 定义路径字符串 String[] strPath = {"/ied03/exam.txt", "/ied02"}; // 创建路径对象(指向目录或文件) Path path = new Path(uri + strPath[choice]); // 判断类型:目录或文件 String type = ""; if (fs.isDirectory(path)) { type = "目录"; } else { type = "文件"; } // 判断存在性 if (fs.exists(path)) { // 删除路径对象指向的目录或文件 boolean result = fs.delete(path, true); // 判断删除是否成功 if (result) { System.out.println(type + "[" + path + "]删除成功!"); } else { System.out.println(type + "[" + path + "]删除失败!"); } } else { System.out.println(type + "[" + path + "]不存在!"); } }
到此这篇关于Java API操作HDFS方法详细讲解的文章就介绍到这了,更多相关Java API操作HDFS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!