首页 > 文章列表 > Java API操作HDFS方法详细讲解

Java API操作HDFS方法详细讲解

java
152 2023-03-17

一、判断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 + "]不存在!");

        }

    }