HDFS的客户端操作
(一)HDFS删除文件和目录
我们来学习如何删除文件。这里要用的API是fs.delete,用于删除 HDFS 中的文件或目录。
基本思路是:
- 获取文件系统
- 调用fs.delete删除指定目录下的文件
- 关闭文件系统连接。
我们来看看fs.delete的格式:fs.delete(要删除的路径,是否递归删除) 。
第一个参数 new Path("/xiyou") 指定了要删除的路径,/xiyou 是 HDFS 中的目录或文件路径。
第二个参数 true 表示递归删除。如果路径是一个目录,且目录下有子文件或子目录,设置为 true 可以将整个目录及其内容全部删除。如果设置为 false,则只能删除空目录。
好了,搞思路和格式之后,我们开始写代码。
参考代码如下:
@Test
public void testDelete() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "root");
// 2 执行删除
fs.delete(new Path("/xiyou"), true);
// 3 关闭资源
fs.close();
}
代码运行完成之后,可以回到UI界面去查看。
(二)HDFS文件详情查看
接下来,我们来学习如何查看文件的详细信息。例如:名称、权限、长度、块信息等等。
这里要用的API是fs.listFiles。
基本思路是:
- 获取文件系统
- 调用fs.listFiles获取指定目录下的文件信息
- 使用迭代器,循环遍历
- 关闭文件系统连接。
参考代码如下:
@Test
public void testListFiles() throws IOException, InterruptedException, URISyntaxException {
// 1获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "root");
// 2 获取文件详情
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("========" + fileStatus.getPath() + "=========");
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getOwner());
System.out.println(fileStatus.getGroup());
System.out.println(fileStatus.getLen());
System.out.println(fileStatus.getModificationTime());
System.out.println(fileStatus.getReplication());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPath().getName());
// 获取块信息
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
// 3 关闭资源
fs.close();
}
(二)HDFS文件和文件夹判断
接下来,我们来学习如何查看文件的详细信息。例如:名称、权限、长度、块信息等等。
这里要用的API是fs.listFiles。
基本思路是:
- 获取文件系统
- 调用fs.listFiles获取指定目录下的文件信息
- 使用迭代器,循环遍历
- 关闭文件系统连接。
参考代码如下:
@Test
public void testListStatus() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件配置信息
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "root");
// 2 判断是文件还是文件夹
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
// 如果是文件
if (fileStatus.isFile()) {
System.out.println("f:"+fileStatus.getPath().getName());
}else {
System.out.println("d:"+fileStatus.getPath().getName());
}
}
// 3 关闭资源
fs.close();
}
三)HDFS文件更名和移动
文件更名和文件移动本质是一样的: 更新了这个文件的访问路径。这两个操作的的API都是rename。
具体如下:
@Test
public void testRename() throws IOException, InterruptedException, URISyntaxException{
// 1 获取文件系统
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "root");
// 2 修改文件名称
fs.rename(new Path("/xiyou/huaguoshan/sunwukong.txt"), new Path("/xiyou/huaguoshan/meihouwang.txt"));
// 3 关闭资源
fs.close();
}
同样的,请大家运行之后,回去ui界面去检查。