java 获取指定目录的文件和文件夹
public class FilesUtils {
public static void main(String[] args) {
String path = "D:/test";
// getAllFiles(path, null).forEach(System.out::println);
// breadthTraversal(path).forEach(System.out::println);
// breadthTraversalByLevel(path).forEach(System.out::println);
// depthTraversalRecursively(new File(path));
depthTraversalStack(path).forEach(System.out::println);
}
/**
* 获取指定目录下面的文件和文件夹(层次遍历/广度遍历,非递归,非队列)
*/
public static List<File> getAllFiles(String path, FileFilter fileFilter) {
List<File> allFiles = new ArrayList<File>();
File file = new File(path);
if (file.exists()) {
List<File> fileList = new ArrayList<File>();
fileList.add(file);
while (fileList.size() > 0) {
allFiles.addAll(fileList);
fileList = getNextLevelFiles(fileList, fileFilter);
}
}
return allFiles;
}
private static List<File> getNextLevelFiles(List<File> fileList, FileFilter fileFilter) {
List<File> nextLevelFiles = new ArrayList<File>();
for (File file : fileList) {
if (file.isDirectory()) {
File[] childs = listFiles(file, fileFilter);
if (childs != null) {
for (File child : childs) {
nextLevelFiles.add(child);
}
}
}
}
return nextLevelFiles;
}
private static File[] listFiles(File file, FileFilter fileFilter) {
return fileFilter == null ? file.listFiles() : file.listFiles(fileFilter);
}
/**
* 广度遍历/层次遍历(借助队列)
*/
public static List<File> breadthTraversal(String path) {
List<File> allFiles = new ArrayList<File>();
File node = new File(path);
if (node.exists()) {
Queue<File> queue = new LinkedList<>();
queue.offer(node);
while (!queue.isEmpty()) {
node = queue.poll();
allFiles.add(node);
if (node.isDirectory()) {
for (File child : node.listFiles()) {
queue.offer(child);
}
}
}
}
return allFiles;
}
/**
* 广度遍历/层次遍历(借助队列, 分层)
*/
public static List<File> breadthTraversalByLevel(String path) {
List<File> allFiles = new ArrayList<>();
File note = new File(path);
if (note.exists()) {
Queue<File> queue = new LinkedList<>();
queue.offer(note);
int level = 0;
while (!queue.isEmpty()) {
allFiles.add(new File("level = " + level++));// 仅表示分层,无其它意义
for (int i = 0, size = queue.size(); i < size; i++) {
note = queue.poll();
allFiles.add(note);
if (note.isDirectory()) {
for (File child : note.listFiles()) {
queue.offer(child);
}
}
}
}
}
return allFiles;
}
// 深度遍历(前序遍历,递归)
public static void depthTraversalRecursively(File file) {
System.out.println(file);
if (file.isDirectory()) {
for (File f : file.listFiles()) {
depthTraversalRecursively(f);
}
}
}
// 深度遍历(前序遍历,非递归, 借助队列)
public static List<File> depthTraversalStack(String path) {
List<File> allFiles = new ArrayList<>();
File node = new File(path);
if (node.exists()) {
Stack<File> stack = new Stack<File>();
stack.push(node);
while (!stack.isEmpty()) {
node = stack.pop();
allFiles.add(node);
if (node.isDirectory()) {
File[] children = node.listFiles();
for (int i = children.length - 1; i >= 0; i--) {
stack.push(children[i]);
}
}
}
}
return allFiles;
}
}
参考
1、深度遍历 java_Java 实现深度遍历和广度遍历数及其应用
https://blog.csdn.net/weixin_28746457/article/details/114345136
2、二叉树各种遍历算法Java 实现总结
https://blog.csdn.net/qq_41866626/article/details/120483860