Java API 操作 HDFS 文件(二)
下载文件
packagecom.xiaowang.hdfs; importjava.io.IOException; importjava.net.URI; importjava.net.URISyntaxException; importorg.apache.hadoop.conf.Configuration; importorg.apache.hadoop.fs.FileSystem; importorg.apache.hadoop.fs.Path; importorg.junit.After; importorg.junit.Before; importorg.junit.Test; publicclassHDFSDemo { FileSystemfs=null; // 每次执行单元测试前都会执行该方法publicvoidsetUp() throwsIOException, InterruptedException, URISyntaxException { Configurationconf=newConfiguration(); // 不需要配置“fs.defaultFS”参数,直接传入URI和用户身份,最后一个参数是安装Hadoop集群的用户,我的是“root”fs=FileSystem.get(newURI("hdfs://localhost:9000"), conf, "root"); } // 单元方法:下载文件publicvoiddownLoadFileToLocal() throwsIOException { /** src:要下载的文件所在的HDFS路径 dst:要下载到本地的目标路径*/Pathsrc=newPath("/123/README.txt"); Pathdst=newPath("/root"); // 默认不删除HDFS源路径的文件,覆盖本地同名文件fs.copyToLocalFile(src, dst); } // 每次执行单元测试后都会执行该方法,关闭资源publicvoidtearDown() { if (null!=fs) { try { fs.close(); } catch (IOExceptione) { e.printStackTrace(); } } } }
查看本地文本系统 /root 目录,存在 README.txt 文件说明下载成功:
重命名文件/目录
通过`FileSystem.rename(Path arg0,Path arg1)`可对 HDFS 文件或目录进行重命名,其中 `arg0` 和 `arg1` 均为 HDFS 文件或目录的完整路径。具体实现如下:
// 单元方法:重命名文件或者文件夹publicvoidrenameFileOrDir() throwsIllegalArgumentException, IOException { //重命名文件fs.rename(newPath("/123/README.txt"), newPath("/123/read.txt")); //重命名文件夹fs.rename(newPath("/123/1"), newPath("/123/data")); }
查看文件/目录状态
通过`FileStatus.getPath()`可查看指定 HDFS 中某个目录下所有文件或文件夹,具体实现如下:
importjava.io.FileNotFoundException; importorg.apache.hadoop.fs.FileStatus; //单元方法:查看文件及文件夹信息publicvoidlistStatus() throwsFileNotFoundException, IllegalArgumentException, IOException{ //使用listStatus()方法获得参数中指定目录下文件和文件夹的元数据信息(文件(夹)名称、路径、长度等),存放在一个数组中FileStatus[] listStatus=fs.listStatus(newPath("/123")); Stringflag=""; for(FileStatusstatus:listStatus){ if(status.isDirectory()){ flag="Directory"; }else { flag="File"; } System.out.println(flag+":"+status.getPath().getName()); } }