어떤 디렉토리 아래에 있는 모든 파일/폴더들을 가져오는 방법에 대해서 알아보겠습니다.

1. File을 이용하여 하위 파일 리스트 가져오기

File과 재귀함수를 이용하여 아래와 같이 디렉토리 하위 파일들을 모두 출력할 수 있습니다.

  • File.listFiles() : 파일이 디렉토리라면, 바로 아래 경로에 있는 모든 파일 리스트를 File 배열로 리턴
  • printFileList(file) : file이 디렉토리라면, 하위 경로의 파일 목록을 출력하기 위해 재귀함수 호출
import java.io.File;

public class Example {

    public static void main(String[] args) {

        String path = "/home/test/my_project";
        File directory = new File(path);

        printFileList(directory);
    }

    public static void printFileList(File directory) {
        File[] files = directory.listFiles();

        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    // 파일인 경우 파일 이름 출력
                    System.out.println("File: " + file.getName());
                } else if (file.isDirectory()) {
                    // 디렉터리인 경우 디렉터리 이름 출력 후 재귀 호출
                    System.out.println("Directory: " + file.getName());
                    printFileList(file);
                }
            }
        }
    }
}

Output:

File: README.md
Directory: java
Directory: DoublyLinkedList
File: MyLinkedList.java
Directory: SinglyLinkedList
File: MyLinkedList.java
Directory: LinkedList
File: DoublyLinkedList.cpp
File: CircularLinkedList.cpp
File: SinglyLinkedList.cpp

2. Path와 Files를 이용하여 하위 파일 리스트 가져오기

Java 7에서 추가된 Path와 Files를 이용하면 더 간단히 하위 파일, 폴더 리스트를 가져올 수 있습니다.

Files.walkFileTree()는 인자로 전달된 디렉토리의 하위 모든 파일/폴더에 대해서 탐색하며 콜백으로 Path 객체를 받을 수 있습니다. Path를 통해 File 객체를 얻을 수도 있습니다.

  • visitFile() : 하위 경로를 탐색하면서 발견된 파일이 인자로 전달됨
  • preVisitDirectory() : 하위 경로를 탐색하면서 발견된 디렉토리가 인자로 전달됨
  • 가장 상위 디렉토리(예제에서 "/home/test/my_project")도 preVisitDirectory()으로 전달됨
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;

public class Example {

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

        String path = "/home/test/my_project";
        Path directory = Paths.get(path);

        Files.walkFileTree(directory, EnumSet.noneOf(FileVisitOption.class),
                Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                System.out.println("File: " + file.getFileName());
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
                System.out.println("Directory: " + dir.getFileName());
                return FileVisitResult.CONTINUE;
            }
        });
    }
}

Output:

Directory: my_project
File: README.md
Directory: java
Directory: DoublyLinkedList
File: MyLinkedList.java
Directory: SinglyLinkedList
File: MyLinkedList.java
Directory: LinkedList
File: DoublyLinkedList.cpp
File: CircularLinkedList.cpp
File: SinglyLinkedList.cpp