Java - 특정 경로의 하위 파일, 폴더 탐색 (Files.walk)

By JS | Last updated: June 16, 2021

Java 8 이상에서만 사용할 수 있는 Files.walk() API를 이용하여 특정 경로의 하위 파일 및 폴더를 탐색하는 방법을 소개합니다.

모든 파일, 폴더 탐색

Files.walk()에 Path 객체를 전달하면 그 경로의 하위 폴더 및 파일들을 탐색할 수 있습니다. 리턴된 Stream을 통해서 List<Path>를 생성할 수 있습니다.

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

public class FilesWalkExample {

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

        Path dirPath = Paths.get("/home/mjs/tests");

        List<Path> result;
        Stream<Path> walk = Files.walk(dirPath);
        result = walk.collect(Collectors.toList());

        for (Path path : result) {
            System.out.println(path);
        }

    }
}

Output:

/home/mjs/tests
/home/mjs/tests/t1.txt
/home/mjs/tests/test2.txt
/home/mjs/tests/test2
/home/mjs/tests/test2/aaa.png
/home/mjs/tests/test1
/home/mjs/tests/test1/ccc.png
/home/mjs/tests/test1.txt
/home/mjs/tests/test3.txt
/home/mjs/tests/test3
/home/mjs/tests/test3/bbb.png

Files.walk(Path)는 기본적으로 하위의 모든 경로를 탐색하며, Files.walk(Path, 1)처럼 두번째 인자에 탐색할 depth를 전달하면, 설정된 깊이만큼만 탐색합니다.

파일만 탐색

Stream에서 filter(Files::isRegularFile)처럼 필터 조건을 설정하면 List에는 파일에 대한 Path 객체만 추가됩니다.

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

public class FilesWalkExample2 {

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

        Path dirPath = Paths.get("/home/mjs/tests");

        List<Path> result;
        Stream<Path> walk = Files.walk(dirPath);
        result = walk.filter(Files::isRegularFile)
                    .collect(Collectors.toList());

        for (Path path : result) {
            System.out.println(path);
        }

    }
}

Output:

/home/mjs/tests/t1.txt
/home/mjs/tests/test2.txt
/home/mjs/tests/test2/aaa.png
/home/mjs/tests/test1/ccc.png
/home/mjs/tests/test1.txt
/home/mjs/tests/test3.txt
/home/mjs/tests/test3/bbb.png

폴더만 탐색

Stream에서 filter(Files::isDirectory)처럼 필터 조건을 설정하면 List에는 폴더에 대한 Path 객체만 추가됩니다.

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

public class FilesWalkExample3 {

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

        Path dirPath = Paths.get("/home/mjs/tests");

        List<Path> result;
        Stream<Path> walk = Files.walk(dirPath);
        result = walk.filter(Files::isDirectory)
                    .collect(Collectors.toList());

        for (Path path : result) {
            System.out.println(path);
        }

    }
}

Output:

/home/mjs/tests
/home/mjs/tests/test2
/home/mjs/tests/test1
/home/mjs/tests/test3

파일 이름으로 찾기

filter()에서 파일이름을 비교하여 원하는 파일만 찾을 수 있습니다.

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

public class FilesWalkExample4 {

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

        Path dirPath = Paths.get("/home/mjs/tests");

        String fileName = "ccc.png";
        List<Path> result;
        Stream<Path> walk = Files.walk(dirPath);
        result = walk.filter(Files::isRegularFile)
                    .filter(p -> p.getFileName().toString().equalsIgnoreCase(fileName))
                    .collect(Collectors.toList());

        for (Path path : result) {
            System.out.println(path);
        }

    }
}

Output:

지정된 경로의 바로 하위 경로만 탐색 (depth 1)

walk()의 두번째 인자로 depth = 1을 전달하면, 지정된 경로의 바로 하위 경로만 탐색합니다.

Stream<Path> walk = Files.walk(dirPath, 1);

Related Posts

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha