最近比较忙,很少写blog了!!!
关于获取目录及子目录下所有文件是常遇到的功能,一般通过递归遍历实现。而生产场景中,一般是遍历nas上的目录,在nas上利用File.listFiles(),在linux系统上无法获取含有中文名的文件的。这里是通过java.nio.file来实现。
直接上代码吧
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List; /*** 遍历目录及其子目录,获取所有非隐藏文件 */
public class NonHiddenFileWalker {/*** 遍历指定目录,获取所有非隐藏文件** @param startDir 起始目录路径* @return 非隐藏文件的路径列表 * @throws IOException 如果访问文件系统出错*/public static List<Path> walkNonHiddenFiles(String startDir) throws IOException {Path rootPath = Paths.get(startDir); List<Path> fileList = new ArrayList<>();// 定义文件访问器SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<>() {// 访问目录前检查是否为隐藏目录@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {if (Files.isHidden(dir)) {return FileVisitResult.SKIP_SUBTREE; // 跳过隐藏目录及其子目录}return FileVisitResult.CONTINUE;}// 处理文件 @Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {if (!Files.isHidden(file)) {fileList.add(file); // 只添加非隐藏文件}return FileVisitResult.CONTINUE;}// 处理访问失败的情况@Overridepublic FileVisitResult visitFileFailed(Path file, IOException exc) {System.err.println(" 访问失败: " + file + " - " + exc.getMessage()); return FileVisitResult.CONTINUE;}};// 执行文件遍历Files.walkFileTree(rootPath, visitor);return fileList;}/*** 主程序入口*/public static void main(String[] args) {try {String directoryPath = "/target/directory"; // 替换为你的目标路径List<Path> nonHiddenFiles = walkNonHiddenFiles(directoryPath);System.out.println(" 找到以下非隐藏文件:");for (Path file : nonHiddenFiles) {System.out.println(file.toString()); }} catch (IOException e) {System.err.println(" 发生错误: " + e.getMessage()); e.printStackTrace(); }}
}