HDFS【Java API操作】

通过java的api对hdfs的资源进行操作

代码:上传、下载、删除、移动/修改、文件详情、判断目录or文件、IO流操作上传/下载

package com.atguigu.hdfsdemo;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;

/*
 * 1.创建FileSystem对象
 * 2.操作资源
 * 3.关闭资源
 * 4.配置的优先级:代码中的>resource中的配置> 集群中的配置 >集群中得default配置
 */
public class HdfsDemo {
    FileSystem fs;
    Configuration conf;

    //1.创建Filesystem对象
    @Before
    public void createFileSystem() throws IOException, InterruptedException {
        //配置的优先级:代码中的>resource中的配置> 集群中的配置 >集群中得default配置
        conf = new Configuration();
        //conf.set("dfs.replication","1"); //设置副本数
        // 获取filesystem对象
        fs = FileSystem.get(URI.create("hdfs://hadoop102:9820"), conf, "atguigu");
    }

    //3.关闭资源
    @After
    public void closeResource() throws IOException {
        if (fs != null) {
            fs.close();
        }
    }

    /**
     * 上传文件
     *
     * @throws IOException
     */
    @Test
    public void upload() throws IOException {
        /**
         * boolean delSrc:是否删除源文件
         * boolean overwrite:如果目标地址如果已经存在和上传对象一样名字的文件是否覆盖;如果为true,那么就覆盖;如果为false但名字又相同那么就抛异常
         * Path src:源文件
         * Path dst:目标地址
         */
        fs.copyFromLocalFile(false, false, new Path("F:/sanguo.txt"), new Path("/user"));
    }

    /**
     * 文件下载
     *
     * @throws IOException
     */
    @Test
    public void download() throws IOException {
        /**
         * boolean delSrc:是否删除源文件
         * Path src:源文件
         * Path dst:目标地址
         * boolean useRawLocalFileSystem :就否使用crc校验
         */
        fs.copyToLocalFile(false, new Path("/user/aaa.txt"), new Path("F:/"), true);
    }

    /**
     * 删除文件夹
     *
     * @throws IOException
     */
    @Test
    public void deleteDir() throws IOException {
        /**
         * Path f:删除的路径
         * boolean recursive :是否递归?
         *                     如果删除的是目录那么必须是true,否则抛异常
         *                     如果删除的是文件那么true和false都可以
         */
        boolean result = fs.delete(new Path("/deleteDir"), true);
        System.out.println("文件是否删除成功:" + result);
    }

    /**
     * 移动文件、修改文件名
     */
    @Test
    public void moveOrUpdateName() throws IOException {
        //移动文件
        boolean result = fs.rename(new Path("/rename.txt"), new Path("/user/"));
        System.out.println("是否移动成功" + result);
        //修改文件名
        boolean rename = fs.rename(new Path("/user/rename.txt"), new Path("/user/afterRename.txt"));
        System.out.println("文件名是否修改成功" + rename);
    }

    /**
     * 查看文件详情:文件名、权限、长度、所属组、所属者、副本数、块信息
     *
     * @throws IOException
     */
    @Test
    public void showFileDetail() throws IOException {
        /**
         * 获取迭代器
         * Path f:查看的文件or目录
         * final boolean recursive:是否递归
         */
        RemoteIterator<LocatedFileStatus> fileIterator = fs.listFiles(new Path("/"), true);
        while (fileIterator.hasNext()) {
            LocatedFileStatus file = fileIterator.next();
            //文件名
            System.out.println("*****************" + file.getPath().getName() + "*****************");
            //权限
            System.out.println(file.getPermission());
            //长度
            System.out.println(file.getLen());
            //所属组
            System.out.println(file.getGroup());
            //所属者
            System.out.println(file.getOwner());
            //副本数
            System.out.println(file.getReplication());
            //块信息
            BlockLocation[] blockLocations = file.getBlockLocations();
            for (BlockLocation blockLocation : blockLocations) {
                //输出块信息
                System.out.println(Arrays.toString(blockLocation.getHosts()));
            }
            //输出结果
            /******************hadoop103_34807*****************
             rw-r-----
             133781
             atguigu
             atguigu
             3
             [hadoop102, hadoop103, hadoop104]*/

        }

    }

    /**
     * 判断文件or目录?
     */
    @Test
    public void fileOrDir() throws IOException {
        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));
        for (FileStatus fileStatus : fileStatuses) {
            System.out.println("*****" + fileStatus.getPath().getName() + "*****");
            if (fileStatus.isFile()) {
                System.out.println("文件");
            } else {
                System.out.println("目录");
            }
        }
    }

    /**
     * 通过IO流上传下载
     */
    @Test
    public void uploadAndDownloadByIO() throws IOException {
        //需求一:将本地f盘的sanguo.txt文件上传到HDFS的根目录"/"
        //创建输入流
        FileInputStream fis = new FileInputStream(new File("F:/sanguo.txt"));
        //创建输出流
        FSDataOutputStream fos = fs.create(new Path("/sanguo.txt"));
        //流对拷
        IOUtils.copyBytes(fis, fos, conf);
        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);
        //需求二:将hdfs的"/user/bbb.txt"文件下载到本地f盘根目录"F:/"
        FSDataInputStream fis2 = fs.open(new Path("/user/bbb.txt"));
        FileOutputStream fos2 = new FileOutputStream(new File("F:/bbb.txt"));
        IOUtils.copyBytes(fis2, fos2, conf);
        IOUtils.closeStream(fis2);
        IOUtils.closeStream(fos2);
    }
}

原文地址:https://www.cnblogs.com/wh984763176/p/13122061.html