Java - 특정 디렉토리의 파일 리스트 탐색 및 출력하는 방법

JS · 15 Apr 2020

특정 디렉토리의 파일 리스트를 출력하는 방법을 소개합니다.

Java의 File 클래스는 다음 API들을 제공합니다.

  • listFiles() : 디렉토리 경로에 있는 파일들을 배열로 리턴
  • listFiles(FilenameFilter filter) : 디렉토리 경로에 있는 파일들을 필터링하고 그 결과를 배열로 리턴
  • listFiles(FileFilter filter) : 디렉토리 경로에 있는 파일들을 필터링하고 그 결과를 배열로 리턴
  • list() : 디렉토리 경로에 있는 파일들의 이름들을 배열로 리턴
  • list(FilenameFilter filter) : 디렉토리 경로에 있는 파일들의 이름들을 필터링하고 그 결과를 배열로 리턴

탐색할 디렉토리는 저의 로컬 폴더 /home/mjs/test/test이며, 이 경로의 파일 구조는 다음과 같습니다.

.
├── file1.txt
├── folder1
│   └── file2.txt
├── folder2
│   ├── file3.txt
│   └── file4.txt
├── folder3
│   ├── file5.txt
│   ├── file6.txt
│   └── folder4
│       ├── text2.txt
│       ├── text3.txt
│       └── text.txt
└── myscript.sh

파일 리스트 출력(listFiles)

listFiles()는 파일 바로 아래에 있는 파일 리스트를 배열로 리턴해 줍니다.

하지만, 재귀적으로 모든 하위 폴더들의 파일들은 가져오지 않습니다.

다음 코드를 실행하면 /home/mjs/test/test 하위의 파일들을 출력합니다.

File dir = new File("/home/mjs/test/test");
File files[] = dir.listFiles();

for (int i = 0; i < files.length; i++) {
    System.out.println("file: " + files[i]);
}

결과

file: /home/mjs/test/test/folder1
file: /home/mjs/test/test/file1.txt
file: /home/mjs/test/test/myscript.sh
file: /home/mjs/test/test/folder3
file: /home/mjs/test/test/folder2

파일 리스트 출력 (Recursive, listFiles)

재귀적으로 listFiles()를 호출하여 하위 폴더들의 파일들도 모두 출력하도록 할 수 있습니다.

다음 코드는 /home/mjs/test/test 하위의 모든 파일들을 출력합니다.

System.out.println("2");
showFilesInDIr("/home/mjs/test/test");


public static void showFilesInDIr(String dirPath) {
    File dir = new File(dirPath);
    File files[] = dir.listFiles();

    for (int i = 0; i < files.length; i++) {
        File file = files[i];
        if (file.isDirectory()) {
            showFilesInDIr(file.getPath());
        } else {
            System.out.println("file: " + file);
        }
    }
}

결과

file: /home/mjs/test/test/folder1/file2.txt
file: /home/mjs/test/test/file1.txt
file: /home/mjs/test/test/myscript.sh
file: /home/mjs/test/test/folder3/file5.txt
file: /home/mjs/test/test/folder3/folder4/text3.txt
file: /home/mjs/test/test/folder3/folder4/text2.txt
file: /home/mjs/test/test/folder3/folder4/text.txt
file: /home/mjs/test/test/folder3/file6.txt
file: /home/mjs/test/test/folder2/file3.txt
file: /home/mjs/test/test/folder2/file4.txt

파일 리스트 출력(listFiles(FilenameFilter))

listFiles(FilenameFilter)를 이용하면 특정 조건으로 파일을 필터링한 결과를 출력할 수 있습니다.

아래 코드는 "file"로 시작하는 파일만 필터링하여 결과로 리턴하는 코드입니다.

File dir = new File("/home/mjs/test/test");
FilenameFilter filter = new FilenameFilter() {
    public boolean accept(File f, String name) {
        return name.startsWith("file");
    }
};

File files[] = dir.listFiles(filter);
for (int i = 0; i < files.length; i++) {
    System.out.println("file: " + files[i]);
}

파일을 탐색할 때마다 accept(File f, String name)가 호출되며, 여기서 File f는 파일의 부모 디렉토리입니다. 즉, /home/mjs/test/test를 의미합니다. String name은 파일의 이름입니다.

결과

file: /home/mjs/test/test/file1.txt

파일 리스트 출력(listFiles(FileFilter))

FilenameFilter는 파일의 이름을 인자로 전달받고 이름으로만 필터링을 해야 합니다. 만약 File을 받고 싶다면 listFiles(FileFilter)를 사용해야 합니다.

다음은 listFiles(FileFilter)로 필터링을 하는 코드입니다.

File dir = new File("/home/mjs/test/test");
FileFilter filter = new FileFilter() {
    public boolean accept(File f) {
        return f.getName().endsWith("txt");
    }
};

File files[] = dir.listFiles(filter);
for (int i = 0; i < files.length; i++) {
    System.out.println("file: " + files[i]);
}

결과

file: /home/mjs/test/test/file1.txt

파일 리스트 출력(Recursive, Filtering)

이번 예제는 재귀적으로 하위 모든 폴더를 탐색하고 특정 조건의 파일만 찾으려고 합니다.

listFiles()만 이용하였고, 필터링 조건은 FilenameFilter 등의 인자로 전달하지 않고 직접 구현하였습니다.

FileFilter filter = f -> f.getName().endsWith("txt");
showFilesInDIr2("/home/mjs/test/test");


public static void showFilesInDIr2(String dirPath) {
    File dir = new File(dirPath);
    File files[] = dir.listFiles();

    for (int i = 0; i < files.length; i++) {
        File file = files[i];
        if (file.isDirectory()) {
            showFilesInDIr(file.getPath());
        } else if (file.getName().endsWith(".txt")){
            System.out.println("file: " + file);
        }
    }
}

결과를 보면 .txt로 끝나는 모든 파일들이 출력되었습니다.

file: /home/mjs/test/test/folder1/file2.txt
file: /home/mjs/test/test/file1.txt
file: /home/mjs/test/test/folder3/file5.txt
file: /home/mjs/test/test/folder3/folder4/text3.txt
file: /home/mjs/test/test/folder3/folder4/text2.txt
file: /home/mjs/test/test/folder3/folder4/text.txt
file: /home/mjs/test/test/folder3/file6.txt
file: /home/mjs/test/test/folder2/file3.txt
file: /home/mjs/test/test/folder2/file4.txt

파일 리스트 출력(파일 이름만)

list()는 하위 경로의 파일 이름들을 배열로 리턴해 줍니다. File 객체가 필요없고 파일 이름만 String으로 필요하다면 이 API를 사용하면 됩니다.

File dir = new File("/home/mjs/test/test");
String[] filenames = dir.list();
for (int i = 0; i < filenames.length; i++) {
    System.out.println("file: " + filenames[i]);
}

결과

file: folder1
file: file1.txt
file: myscript.sh
file: folder3
file: folder2

파일 리스트 출력(파일 이름만, Filtering)

list(FilenameFilter filter)는 특정 조건으로 파일 이름을 필터링하고 그 결과를 배열로 리턴합니다.

File dir = new File("/home/mjs/test/test");
String[] filenames = dir.list((f,name)->name.endsWith(".txt"));
for (int i = 0; i < filenames.length; i++) {
    System.out.println("file: " + filenames[i]);
}

결과

file: file1.txt

참고