文件或目录的常用遍历方式
# 文件或目录的常用遍历方式
在 Java 中,遍历文件或目录是常见的操作,特别是在处理文件系统时。
# 1. 使用 File
类的 listFiles()
方法递归遍历目录
使用说明:
- 适用场景: 适用于遍历文件系统中的所有文件和目录,包括子目录。
- 注意事项: 递归遍历的方式适合处理深层次的目录结构,但可能会遇到栈溢出问题,尤其是在目录层级过深时。
代码示例:
import java.io.File;
public class RecursiveFileTraversalExample {
public static void main(String[] args) {
// 指定需要遍历的根目录
File rootDirectory = new File("path/to/directory");
// 调用递归遍历方法,遍历根目录及其所有子目录和文件
listAllFiles(rootDirectory);
}
/**
* 递归遍历目录下的所有文件和子目录
* @param directory 当前遍历的目录
*/
public static void listAllFiles(File directory) {
// 获取当前目录下的所有文件和子目录
File[] files = directory.listFiles();
// 检查是否有文件或子目录(避免空指针异常)
if (files != null) {
for (File file : files) {
// 判断是否为目录
if (file.isDirectory()) {
// 如果是目录,输出目录路径并递归遍历
System.out.println("Directory: " + file.getAbsolutePath());
listAllFiles(file); // 递归调用遍历子目录
} else {
// 如果是文件,输出文件路径
System.out.println("File: " + file.getAbsolutePath());
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
参数说明:
File directory
:表示需要遍历的文件或目录对象。directory.listFiles()
:返回当前目录下的所有文件和子目录的数组。
# 2. 使用 Files.walk()
方法遍历目录(Java NIO)
使用说明:
- 适用场景: 适用于遍历文件系统中的所有文件和目录,支持流式处理,更高效。
- 注意事项: 仅适用于 Java 8 及以上版本,能够处理大规模的目录结构,且可以方便地结合流操作。
代码示例:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class FilesWalkExample {
public static void main(String[] args) {
// 指定需要遍历的根目录
Path rootPath = Paths.get("path/to/directory");
// 使用 try-with-resources 自动关闭资源
try (Stream<Path> paths = Files.walk(rootPath)) {
// 遍历流中的每个路径(文件或目录)
paths.forEach(path -> {
// 判断当前路径是否为目录
if (Files.isDirectory(path)) {
System.out.println("Directory: " + path.toAbsolutePath());
} else {
// 如果是文件
System.out.println("File: " + path.toAbsolutePath());
}
});
} catch (IOException e) {
// 处理IO异常
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
参数说明:
Path rootPath
:表示需要遍历的根目录路径。Files.walk(rootPath)
:返回一个包含所有子目录和文件的流(Stream<Path>
),支持流式操作。Files.isDirectory(path)
:判断当前路径是否为目录,返回true
或false
。
# 3. 使用 Files.list()
方法遍历单层目录
使用说明:
- 适用场景: 适用于遍历单层目录(不包含子目录),获取目录下的所有文件和子目录。
- 注意事项: 仅适用于 Java 8 及以上版本,不会递归进入子目录,仅处理当前目录下的内容。
代码示例:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class FilesListExample {
public static void main(String[] args) {
// 指定需要遍历的根目录
Path directoryPath = Paths.get("path/to/directory");
// 使用 try-with-resources 自动关闭资源
try (Stream<Path> paths = Files.list(directoryPath)) {
// 遍历单层目录的每个路径(文件或目录)
paths.forEach(path -> {
// 判断当前路径是否为目录
if (Files.isDirectory(path)) {
System.out.println("Directory: " + path.toAbsolutePath());
} else {
// 如果是文件
System.out.println("File: " + path.toAbsolutePath());
}
});
} catch (IOException e) {
// 处理IO异常
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
参数说明:
Path directoryPath
:表示需要遍历的目录路径。Files.list(directoryPath)
:返回一个包含当前目录下所有文件和子目录的流(Stream<Path>
)。
# 4. 使用 FileVisitor
接口和 Files.walkFileTree()
方法遍历目录
使用说明:
- 适用场景: 适用于需要更细粒度控制遍历过程的场景,如在遍历过程中执行特定操作(如过滤、删除等)。
- 注意事项: 适用于 Java 7 及以上版本,提供更灵活的遍历控制,能够处理复杂的遍历需求。
代码示例:
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class FileVisitorExample {
public static void main(String[] args) {
// 指定需要遍历的根目录
Path rootPath = Paths.get("path/to/directory");
try {
// 使用walkFileTree方法遍历文件树
Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
/**
* 处理文件时的逻辑
*/
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
// 输出文件路径
System.out.println("File: " + file.toAbsolutePath());
return FileVisitResult.CONTINUE; // 继续遍历
}
/**
* 进入目录前的逻辑
*/
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
// 输出目录路径
System.out.println("Directory: " + dir.toAbsolutePath());
return FileVisitResult.CONTINUE; // 继续遍历
}
/**
* 访问文件失败时的逻辑(如权限问题)
*/
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
// 输出错误信息
System.err.println("Failed to access: " + file.toAbsolutePath() + " (" + exc.getMessage() + ")");
return FileVisitResult.CONTINUE; // 忽略错误继续遍历
}
});
} catch (IOException e) {
// 处理IO异常
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
参数说明:
Path rootPath
:表示需要遍历的根目录路径。Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>())
:使用文件树遍历,支持自定义的文件处理逻辑。FileVisitResult.CONTINUE
:控制遍历的继续或中断,CONTINUE
表示继续遍历。
# 5. 使用递归方法遍历文件和目录(手动实现)
使用说明:
- 适用场景: 适用于自定义的文件或目录遍历逻辑,常用于简单文件系统操作。
- 注意事项: 可能会遇到递归过深导致的栈溢出问题,适合小规模的文件系统遍历。
代码示例:
import java.io.File;
public class ManualRecursiveTraversalExample {
public static void main(String[] args) {
// 指定需要遍历的根目录
File rootDirectory = new File("path/to/directory");
// 调用递归遍历方法,遍历根目录及其所有子目录和文件
traverseDirectory(rootDirectory);
}
/**
* 递归遍历目录下的所有文件和子目录
* @param directory 当前遍历的目录
*/
public static void traverseDirectory(File directory) {
// 判断是否为目录
if (directory.isDirectory()) {
System.out.println("Directory: " + directory.getAbsolutePath());
// 获取当前目录下的所有文件和子目录
File[] files = directory.listFiles();
// 检查是否有文件或子目录(避免空指针异常)
if (files != null) {
for (File file : files) {
// 递归遍历子目录或输出文件路径
traverseDirectory(file);
}
}
} else {
// 如果是文件,输出文件路径
System.out.println("File: " + directory.getAbsolutePath());
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
参数说明:
File directory
:表示需要遍历的文件或目录对象。directory.listFiles()
:获取当前目录下的所有文件和子目录。
# 6. 文件或目录的遍历方式总结
File.listFiles()
和递归方法适合简单的文件和目录遍历,适用于快速实现文件遍历逻辑。Files.walk()
提供了更高效的流式处理,适合需要大规模遍历的场景,结合流操作更灵活。FileVisitor
和walkFileTree()
适用于需要复杂控制的遍历过程,支持更多的操作和自定义逻辑。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08