9.Java API 操作 HDFS 文件(三)
任务目的
- 学会使用 Java API 删除指定的 HDFS 文件或目录
- 学会使用 Java API 查看指定 HDFS 目录下所有文件信息和对应块信息
任务清单
- 任务1:删除文件/目录
- 任务2:查看指定路径中文件和块信息
详细任务步骤
任务1:删除文件/目录
通过FileSystem.delete(Path f,Boolean recursive)
可删除指定的 HDFS 文件或目录,其中 f
为需要删除文件或目录的完整路径,recursive
用来确定是否进行递归删除,若是删除文件则为 false
,若是删除的是目录则为 True
。具体实现如下:
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 deleteFileOrDir() throws IllegalArgumentException, IOException{
//删除文件,第二参数:是否递归,若是文件或者空文件夹时可以为false,若是非空文件夹则需要为true
fs.delete(new Path("/123/read.txt"),false);
//删除文件夹
fs.delete(new Path("/123/data"), true);
}
// 每次执行单元测试后都会执行该方法,关闭资源
@After
public void tearDown() {
if (null != fs) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
删除之前:
图1
删除之后,查看 HDFS 的 /123 目录,发现其下的 read.txt 文件和 data 目录都被删除成功:
图2
任务2:查看指定路径中文件和块信息
通过FileSystem.listFiles(Path f,Boolean recursive)
可递归获取指定 HDFS 目录下的所有文件的绝对路径,其中 f
为指定路径,recursive
用来确定是否进行递归列出。具体实现如下:
import java.io.FileNotFoundException;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.RemoteIterator;
//单元方法:查看目录信息,只显示该目录下的文件信息
@Test
public void listFiles() throws FileNotFoundException, IllegalArgumentException, IOException{
//使用迭代器递归获取该目录下的所有文件
RemoteIterator<LocatedFileStatus> listfile=fs.listFiles(new Path("/123"), true);
while(listfile.hasNext()){
LocatedFileStatus fileStatus=listfile.next();
System.out.println("文件路径:"+fileStatus.getPath());
System.out.println("文件名称:"+fileStatus.getPath().getName());
System.out.println("块的大小:"+fileStatus.getBlockSize());
System.out.println("文件所有者:"+fileStatus.getOwner());
System.out.println("文件所属组:"+fileStatus.getGroup());
System.out.println("文件权限:"+fileStatus.getPermission());
System.out.println("副本个数:"+fileStatus.getReplication());
System.out.println("文件长度:"+fileStatus.getLen());
System.out.println("-----块的信息-----");
BlockLocation[] blockLocations=fileStatus.getBlockLocations();
for(BlockLocation bLocation:blockLocations){
System.out.println("块的长度:"+bLocation.getLength()+"\t块起始偏移量:"+bLocation.getOffset());
//块所在的DataNode节点
String[] hosts = bLocation.getHosts();
System.out.print("DataNode: ");
for(String str:hosts){
System.out.print(str+"\t");
}
System.out.println();
}
System.out.println("------------------------");
}
}
执行结果如下所示:
图3
标签:,文件,fs,System,println,import,out From: https://www.cnblogs.com/Cuckoo123456/p/17470437.html