6.3 Java API 操作 HDFS 文件(二)

任务目的

  • 学会使用 Java API 将 HDFS 文件下载到本地指定位置
  • 掌握对 HDFS 文件或目录重命名的使用方法
  • 学会使用 Java API 查看指定 HDFS 中某个目录下所有的文件或文件夹

任务清单

  • 任务1:下载文件
  • 任务2:重命名文件/目录
  • 任务3:查看文件/目录状态

详细任务步骤

任务1:创建目录

  通过FileSystem.copyToLocalFile(Path src,Patch dst)可将 HDFS 文件下载到本地的指定位置上,其中 src 和 dst 均为文件的完整路径。具体实现如下:

package com.hongyaa.hdfs;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class HDFSDemo {
	FileSystem fs = null;

	// 每次执行单元测试前都会执行该方法
	@Before
	public void setUp() throws IOException, InterruptedException, URISyntaxException {
		Configuration conf = new Configuration();
		// 不需要配置“fs.defaultFS”参数,直接传入URI和用户身份,最后一个参数是安装Hadoop集群的用户,我的是“root”
		fs = FileSystem.get(new URI("hdfs://localhost:9000"), conf, "root");
	}

	// 单元方法:下载文件
	@Test
	public void downLoadFileToLocal() throws IOException {
		/*
		 * src:要下载的文件所在的HDFS路径 dst:要下载到本地的目标路径
		 */
		Path src = new Path("/123/README.txt");
		Path dst = new Path("/root");
		// 默认不删除HDFS源路径的文件,覆盖本地同名文件
		fs.copyToLocalFile(src, dst);
	}

	// 每次执行单元测试后都会执行该方法,关闭资源
	@After
	public void tearDown() {
		if (null != fs) {
			try {
				fs.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

  查看本地文本系统 /root 目录,存在 README.txt 文件说明下载成功:

Vditor

图1

任务2:重命名文件/目录

  通过FileSystem.rename(Path arg0,Path arg1)可对 HDFS 文件或目录进行重命名,其中 arg0 和 arg1 均为 HDFS 文件或目录的完整路径。具体实现如下:

    // 单元方法:重命名文件或者文件夹
    @Test
    public void renameFileOrDir() throws IllegalArgumentException, IOException {
        //重命名文件
        fs.rename(new Path("/123/README.txt"), new Path("/123/read.txt"));
        //重命名文件夹
        fs.rename(new Path("/123/1"), new Path("/123/data"));
    }

  执行结果如下所示:

Vditor

图2

任务3:查看文件/目录状态

  通过FileStatus.getPath()可查看指定 HDFS 中某个目录下所有文件或文件夹,具体实现如下:

import java.io.FileNotFoundException;
import org.apache.hadoop.fs.FileStatus;

    //单元方法:查看文件及文件夹信息
    @Test
    public void listStatus() throws FileNotFoundException, IllegalArgumentException, IOException{
        //使用listStatus()方法获得参数中指定目录下文件和文件夹的元数据信息(文件(夹)名称、路径、长度等),存放在一个数组中
        FileStatus[] listStatus = fs.listStatus(new Path("/123"));
        String flag="";
        for(FileStatus status:listStatus){
            if(status.isDirectory()){
                flag="Directory";
            }else {
                flag="File";
            }
            System.out.println(flag+":"+status.getPath().getName());
        } 
    }

  执行结果如下所示:

Vditor

图3

猜你喜欢

转载自blog.csdn.net/c_lanxiaofang/article/details/107828211