最近比較忙,很少寫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(); }}
}