java如何扫描文件
Java 扫描文件的方法
使用 java.io.File 和递归扫描目录
通过 File 类的 listFiles() 方法可以获取目录下的所有文件和子目录,结合递归实现深度扫描。
import java.io.File;
public class FileScanner {
public static void scanDirectory(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
scanDirectory(file); // 递归扫描子目录
} else {
System.out.println("File: " + file.getAbsolutePath());
}
}
}
}
public static void main(String[] args) {
scanDirectory(new File("/path/to/directory"));
}
}
使用 Files.walk()(Java 8+)
Java 8 引入的 Files.walk() 方法可以快速遍历目录树,返回 Stream<Path>。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
public class FileWalker {
public static void main(String[] args) throws IOException {
Path start = Paths.get("/path/to/directory");
Files.walk(start)
.filter(Files::isRegularFile)
.forEach(System.out::println);
}
}
使用 Files.newDirectoryStream()
适用于需要逐个处理目录中的文件,避免一次性加载所有文件到内存。

import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class DirectoryStreamExample {
public static void main(String[] args) {
Path dir = Paths.get("/path/to/directory");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path file : stream) {
System.out.println(file.getFileName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 Apache Commons IO
第三方库 Apache Commons IO 提供 FileUtils.listFiles() 方法,支持递归和文件过滤。
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.Collection;
public class CommonsIOExample {
public static void main(String[] args) {
Collection<File> files = FileUtils.listFiles(
new File("/path/to/directory"),
new String[]{"txt", "java"}, // 扩展名过滤
true // 递归
);
files.forEach(System.out::println);
}
}
使用 Java 7 的 PathMatcher
通过 FileSystem.getPathMatcher() 实现基于通配符或正则表达式的文件匹配。
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class PathMatcherExample {
public static void main(String[] args) throws Exception {
Path dir = Paths.get("/path/to/directory");
PathMatcher matcher = FileSystems.getDefault()
.getPathMatcher("glob:/*.{java,txt}");
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (matcher.matches(file)) {
System.out.println(file);
}
return FileVisitResult.CONTINUE;
}
});
}
}
注意事项
- 处理大目录时,
Files.walk()或递归可能消耗较多内存,建议使用DirectoryStream。 - 检查文件权限,避免因权限不足导致扫描失败。
- 注意符号链接(symlink)的处理,可通过
Files.isSymbolicLink()判断。






