面试题答案
一键面试异常处理思路
- 文件权限不足异常:在Java中,文件权限不足通常会抛出
SecurityException
。捕获该异常,记录日志并继续遍历其他文件或目录,以保证遍历的完整性。 - 目录不存在异常:目录不存在会抛出
NoSuchFileException
。同样捕获该异常,记录日志,然后跳过该目录继续后续遍历。
优化遍历效率思路
- 减少不必要的I/O操作:在进入目录前,先使用
Files.exists()
方法判断目录是否存在,避免进入不存在的目录而产生异常。 - 缓存文件和目录信息:对于频繁访问的文件或目录信息,可以进行缓存,减少重复的I/O查询。
核心代码逻辑
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DirectoryTraversal {
private static final Logger logger = Logger.getLogger(DirectoryTraversal.class.getName());
public static void traverseDirectory(String directoryPath) {
Path path = Paths.get(directoryPath);
if (!Files.exists(path)) {
logger.log(Level.WARNING, "目录不存在: " + directoryPath);
return;
}
File directory = path.toFile();
if (!directory.isDirectory()) {
logger.log(Level.WARNING, "指定路径不是目录: " + directoryPath);
return;
}
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
try {
if (file.isDirectory()) {
traverseDirectory(file.getAbsolutePath());
} else {
// 处理文件
System.out.println("处理文件: " + file.getAbsolutePath());
}
} catch (SecurityException e) {
logger.log(Level.SEVERE, "文件权限不足: " + file.getAbsolutePath(), e);
}
}
}
}
public static void main(String[] args) {
String directoryPath = "/your/directory/path";
traverseDirectory(directoryPath);
}
}
在上述代码中:
- 异常处理:使用
try-catch
块捕获SecurityException
,处理文件权限不足异常。记录异常信息到日志,确保程序继续执行而不中断遍历。 - 优化遍历效率:在开始遍历目录前,使用
Files.exists()
方法判断目录是否存在,避免进入不存在的目录。同时,对listFiles()
的返回值进行null
检查,防止空指针异常,减少不必要的I/O操作。