递归: 程序调用自身的编程技巧称为递归。
用递归算法解决汉诺塔、阶乘等问题都很经典,一般我们查询系统中目录下的所有文件也会用到递归的思想。
- 下面我们用java代码来实现打印本地指定路径下的所有文件:
/**
* 递归打印本地目录
* @param file
*/
public static void printLocal(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
//递归调用
print(files[i]);
}
}
System.out.println(file);
}
}
按照上面的思想,那打印hdfs下指定路径的所有文件名字岂不是一样?所以我们可以用以下代码来实现。
- 打印hdfs指定路径下的所有文件:
package com.lijie.recursion;
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;
/**
*
* @author lijie
*
*/
public class RecurSionTest {
public static void main(String[] args) throws Exception {
//调用递归打印目录的方法
printDir("/");
}
/**
* 递归打印目录
* @param dir
* @throws Exception
*/
public static void printDir(String dir) throws Exception {
FileSystem fs = getFileSystem();
FileStatus[] globStatus = fs.listStatus(new Path(dir));
Path[] stat2Paths = FileUtil.stat2Paths(globStatus);
for (int i = 0; i < stat2Paths.length; i++) {
System.out.println(stat2Paths[i].toString());
//判断是否为文件夹
if (fs.isDirectory(stat2Paths[i])) {
//递归调用
printDir(stat2Paths[i].toString());
}
}
}
/**
* 获取FileSystem
* @param dir
* @return
* @throws Exception
*/
public static FileSystem getFileSystem() throws Exception {
Configuration conf = new Configuration();
URI uri = new URI("hdfs://lijie:9000");
FileSystem fs = FileSystem.get(uri, conf);
return fs;
}
}
结果如下: