Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

15.11. 遍历目录和文件

15.11.1. listFiles()

			
package cn.netkiller.path;

import lombok.Data;

import java.io.File;
import java.io.IOException;

@Data
public class FileDirectory {
    public static void main(String[] args) throws IOException {
//        String path = "D:\\TMP";/     //要遍历的路径 windows
        String path = "/etc";        	//要遍历的路径 linux/mac
        File file = new File(path);     //获取其file对象
        listFiles(file);
    }

    private static void listFiles(File file) {
        File[] files = file.listFiles();
        if (files == null) return;
        for (File f : files) {
            if (f.isDirectory())    //若是目录,则递归打印该目录下的文件
                listFiles(f);
            if (f.isFile())         //若是文件,直接打印
                System.out.println(f);
        }
    }
}			
			
			
			
    public static Set<String> listFilesStream(String dir) {
        return Stream.of(Objects.requireNonNull(new File(dir).listFiles()))
                .filter(file -> file.isFile())
                .map(File::toString)
                .collect(Collectors.toSet());
    }
			
			

15.11.2. Files.newDirectoryStream

			
package cn.netkiller.test;

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.Set;

public class FileDirectory {
    public static void main(String[] args) throws IOException {
        String path = "/etc";        //要遍历的路径
        listDirectoryStream(path).forEach(file -> {
            System.out.println(file);
        });
    }


    public static Set<String> listDirectoryStream(String dir) throws IOException {
        Set<String> fileSet = new HashSet<>();
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(dir))) {
            for (Path path : stream) {
                if (!Files.isDirectory(path)) {
                    fileSet.add(path.toString());
                }
            }
        }
        return fileSet;
    }
}			
			
			

递归遍历目录

			
    public static Set<String> listDirectoryStream(String dir) {
        Set<String> fileSet = new HashSet<>();
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(dir))) {
            for (Path path : stream) {
                if (!Files.isDirectory(path)) {
                    fileSet.add(path.toString());
                } else {
                    listDirectoryStream(path.toString()).forEach(file -> {
                        fileSet.add(file);
                    });
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileSet;
    }			
			
			

15.11.3. Files.list

			
package cn.netkiller.test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class FileDirectory {
    public static void main(String[] args) throws IOException {

        String path = "/etc";        //要遍历的路径
        filesList(path).forEach(file -> {
            System.out.println(file);
        });
    }

    public static Set<String> filesList(String dir) throws IOException {
        try (Stream<Path> stream = Files.list(Paths.get(dir))) {
            return stream
                    .filter(file -> !Files.isDirectory(file))
//                    .map(Path::getFileName)
                    .map(Path::toString)
                    .collect(Collectors.toSet());
        }
    }
}
			
			
			

15.11.4. Files.walk 递归遍历目录

			
package cn.netkiller.test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class FileDirectory {
    public static void main(String[] args) throws IOException {

        String path = "/tmp/test";        //要遍历的路径
        filesWalk(path).forEach(file -> {
            System.out.println(file);
        });
    }

    public static Set<String> filesWalk(String dir) {
        try (Stream<Path> stream = Files.walk(Paths.get(dir))) {
//            stream.toList().forEach(path -> {
//                System.out.println(path.toString());
//            });
//            return stream.sorted().map(Path::toString).collect(Collectors.toSet());
            return stream.sorted().filter(file -> !Files.isDirectory(file))
//                    .map(Path::getFileName)
                    .map(Path::toString)
                    .collect(Collectors.toSet());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new HashSet<>();
    }
}
			
			

指定目录深度 5 层

			
Stream<Path> stream = Files.walk(Paths.get(dir), 5)			
			
			
			
    public Set<String> listFilesWalk(String dir, int depth) throws IOException {
        try (Stream<Path> stream = Files.walk(Paths.get(dir), depth)) {
            return stream
                    .filter(file -> !Files.isDirectory(file))
                    .map(Path::getFileName)
                    .map(Path::toString)
                    .collect(Collectors.toSet());
        }
    }			
			
			

15.11.5. SimpleFileVisitor

			
    public Set<String> listFilesWalkAndVisitor(String dir) throws IOException {
        Set<String> fileList = new HashSet<>();
        Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                if (!Files.isDirectory(file)) {
                    fileList.add(file.getFileName().toString());
                }
                return FileVisitResult.CONTINUE;
            }
        });
        return fileList;
    }