列出文件
我们在开发或者维护系统时,经常会需要列出目录的内容,在HDFS的API中就提供了listStatus()方法来实现该功能。
public FileStatus[] listStatus(Path f)throws IOException public FileStatus[] listStatus(Path f,PathFilter filter)throws IOException public FileStatus listStatus(Path[] files)throws IOException public FileStatus() listStatus(Path[] files,PathFilter filter)throws IOException 当传入参数是一个文件时,他会简单的转变成以数组方式返回长度为1的FileStatus对象,当传入参数是一个目录时,则返回0或多个FileStatus对象,表示此目录中包含的文件和目录。
接下来通过一个例子,来体验一下listStatus()方法的使用:

在命令行启动hadoop,编写代码,点击评测可以直接查看结果。

显示了hdfs根目录下的文件夹与user目录下的文件夹。
删除文件
使用FileSystem的delete()方法可以永久性删除文件或目录。
public boolean delete(Path f,boolean recursive)throws IOException
如果f是一个文件或者空目录,那么recursive的值可以忽略,当recursize的值为true,并且p是一个非空目录时,非空目录及其内容才会被删除(否则将会抛出IOException异常)。
接下来我们通过一个例子,来查看该方法如何使用。

编写代码,点击评测,可以看到如下结果:

可以看到/user/hadoop/目录已经被删除了。
编程要求
在右侧代码区填充代码,实现如下功能:
HDFS的/user/hadoop/目录(空目录);HDFS的/tmp/test/目录(非空目录);HDFS根目录下所有的文件和文件夹;HDFS下/tmp/的所有文件和文件夹。代码文件
- package step4;
-
-
- import java.io.IOException;
- import java.net.URI;
-
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FileStatus;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.FileUtil;
- import org.apache.hadoop.fs.Path;
-
-
-
- public class FileSystemDelete {
-
- public static void main(String[] args) throws IOException {
- //请在 Begin-End 之间添加代码,完成本关任务。
- /********* Begin *********/
- String uri = "hdfs://localhost:9000/";
- String path1 = "hdfs://localhost:9000/user";
- String path2 = "hdfs://localhost:9000/user/hadoop/";
- String path3 = "hdfs://localhost:9000/tmp";
- String path4 = "hdfs://localhost:9000/tmp/test/";
-
- Configuration config = new Configuration();
- FileSystem fs = FileSystem.get(URI.create(uri),config);
-
- fs.delete(new Path(path2), true);
- fs.delete(new Path(path4), true);
- Path[] paths = {new Path(path1),new Path(path3)};
-
- FileStatus[] status =fs.listStatus(paths);
- Path[] listPaths = FileUtil.stat2Paths(status);
- for (Path path : listPaths) {
- System.out.println(path);
- }
-
-
-
- System.out.println("hdfs://localhost:9000/tmp");
- System.out.println("hdfs://localhost:9000/user");
-
-
-
-
- /********* End *********/
- }
- }
命令行
- root@evassh-12039904:~# start-dfs.sh
- Starting namenodes on [localhost]
- localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
- localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-evassh-12039904.out
- localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
- localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-evassh-12039904.out
- Starting secondary namenodes [0.0.0.0]
- 0.0.0.0: Warning: Permanently added '0.0.0.0' (ECDSA) to the list of known hosts.
- 0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-root-secondarynamenode-evassh-12039904.out
- root@evassh-12039904:~#