Java File 클래스 완벽 가이드

1. 개요

java.io.File 클래스는 파일이나 디렉터리 경로의 추상적 표현입니다. 주로 파일 및 디렉터리의 생성, 검색, 삭제 작업에 사용됩니다.

2. 생성자

File 클래스는 세 가지 주요 생성자를 제공합니다:

  • public File(String pathname) : 주어진 경로 문자열을 추상 경로로 변환하여 File 객체 생성
  • public File(String parent, String child) : 부모 경로와 자식 경로 문자열로 File 객체 생성
  • public File(File parent, String child) : 부모 File 객체와 자식 경로 문자열로 File 객체 생성

예제 코드:

// 경로 문자열
String path = "D:\\aaa.txt";
File f1 = new File(path);

// 부모/자식 문자열
String parent = "d:\\aaa";
String child = "bbb.txt";
File f2 = new File(parent, child);

// 부모 File 객체 + 자식 문자열
File parentDir = new File("d:\\aaa");
String child2 = "bbb.txt";
File f3 = new File(parentDir, child2);

참고: File 객체는 실제 디스크에 파일/디렉터리가 존재하는지 여부와 관계없이 생성됩니다.

3. 주요 메서드

3.1 정보 조회 메서드

  • public String getAbsolutePath() : 절대 경로 반환
  • public String getPath() : 생성자에 사용된 경로 반환
  • public String getName() : 파일 또는 디렉터리 이름 반환
  • public long length() : 파일 크기(바이트) 반환

예제:

File f = new File("d:/aaa/bbb.java");
System.out.println("절대 경로: " + f.getAbsolutePath());
System.out.println("생성 경로: " + f.getPath());
System.out.println("이름: " + f.getName());
System.out.println("크기: " + f.length() + " 바이트");

File dir = new File("d:/aaa");
System.out.println("디렉터리 절대 경로: " + dir.getAbsolutePath());
System.out.println("디렉터리 이름: " + dir.getName());

출력:

절대 경로: d:\aaa\bbb.java
생성 경로: d:\aaa\bbb.java
이름: bbb.java
크기: 636 바이트
디렉터리 절대 경로: d:\aaa
디렉터리 이름: aaa

참고: length()는 디렉터리에 대해 사용할 경우 반환값이 정의되지 않습니다.

3.2 절대 경로와 상대 경로

  • 절대 경로: 드라이브 문자부터 시작하는 완전한 경로 (예: D:\bbb.java)
  • 상대 경로: 현재 프로젝트 디렉터리를 기준으로 하는 경로 (예: bbb.java)
File f1 = new File("D:\\bbb.java");
System.out.println(f1.getAbsolutePath()); // D:\bbb.java

File f2 = new File("bbb.java");
System.out.println(f2.getAbsolutePath()); // D:\idea_project_test4\bbb.java

3.3 확인 메서드

  • public boolean exists() : 파일/디렉터리 존재 여부
  • public boolean isDirectory() : 디렉터리인지 확인
  • public boolean isFile() : 파일인지 확인
File f = new File("d:\\aaa\\bbb.java");
File d = new File("d:\\aaa");
System.out.println("파일 존재: " + f.exists());
System.out.println("디렉터리 존재: " + d.exists());
System.out.println("디렉터리 여부: " + d.isDirectory());
System.out.println("파일 여부: " + d.isFile());
파일 존재: true
디렉터리 존재: true
디렉터리 여부: true
파일 여부: false

3.4 생성 및 삭제 메서드

  • public boolean createNewFile() : 새로운 빈 파일 생성 (존재하지 않을 때만)
  • public boolean delete() : 파일 또는 디렉터리 삭제
  • public boolean mkdir() : 디렉터리 생성
  • public boolean mkdirs() : 상위 디렉터리 포함하여 디렉터리 생성
// 파일 생성
File f1 = new File("aaa.txt");
System.out.println("생성 전 존재: " + f1.exists()); // false
System.out.println("생성 성공: " + f1.createNewFile()); // true
System.out.println("생성 후 존재: " + f1.exists()); // true

// 단일 디렉터리
File d1 = new File("newDir");
System.out.println("디렉터리 생성: " + d1.mkdir()); // true

// 다중 디렉터리
File d2 = new File("newDira\\newDirb");
System.out.println("mkdir 실패: " + d2.mkdir()); // false (상위 없음)
System.out.println("mkdirs 성공: " + d2.mkdirs()); // true

// 삭제
System.out.println("파일 삭제: " + f1.delete()); // true
System.out.println("디렉터리 삭제: " + d1.delete()); // true
System.out.println("다중 디렉터리 삭제: " + d2.delete()); // false (비어있지 않음)

참고: delete()로 디렉터리를 삭제하려면 디렉터리가 비어 있어야 합니다.

4. 디렉터리 탐색

  • public String[] list() : 디렉터리 내 모든 파일/디렉터리 이름 문자열 배열 반환
  • public File[] listFiles() : 디렉터리 내 모든 파일/디렉터리 File 객체 배열 반환
File dir = new File("d:\\java_code");
String[] names = dir.list();
for (String name : names) {
    System.out.println(name);
}
File[] files = dir.listFiles();
for (File file : files) {
    System.out.println(file.getAbsolutePath());
}

참고: listFiles()를 호출하려면 해당 File 객체가 실제 존재하는 디렉터리여야 합니다. 그렇지 않으면 null이 반환됩니다.

5. 재귀를 이용한 하위 디렉터리 출력

디렉터리 깊이를 알 수 없으므로 재귀 호출을 사용합니다.

public class RecursivePrint {
    public static void main(String[] args) {
        File dir = new File("D:\\aaa");
        printAll(dir);
    }
    
    public static void printAll(File dir) {
        File[] items = dir.listFiles();
        if (items == null) return;
        for (File item : items) {
            if (item.isFile()) {
                System.out.println("파일: " + item.getAbsolutePath());
            } else {
                System.out.println("디렉터리: " + item.getAbsolutePath());
                printAll(item);
            }
        }
    }
}

6. 종합 예제

6.1 특정 확장자 파일 검색

D:\aaa 디렉터리에서 .java 파일을 모두 찾아 출력합니다.

public class FileSearch {
    public static void main(String[] args) {
        File dir = new File("D:\\aaa");
        searchJava(dir);
    }
    
    public static void searchJava(File dir) {
        File[] items = dir.listFiles();
        if (items == null) return;
        for (File item : items) {
            if (item.isFile()) {
                if (item.getName().endsWith(".java")) {
                    System.out.println("찾은 파일: " + item.getAbsolutePath());
                }
            } else {
                searchJava(item);
            }
        }
    }
}

6.2 FileFilter로 최적화

java.io.FileFilter 인터페이스를 구현하여 조건에 맞는 파일만 필터링합니다.

public class FilterDemo {
    public static void main(String[] args) {
        File dir = new File("D:\\aaa");
        filterAndPrint(dir);
    }
    
    public static void filterAndPrint(File dir) {
        // 익명 클래스 사용
        File[] items = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".java") || pathname.isDirectory();
            }
        });
        if (items == null) return;
        for (File item : items) {
            if (item.isFile()) {
                System.out.println("필터된 파일: " + item.getAbsolutePath());
            } else {
                filterAndPrint(item);
            }
        }
    }
}

6.3 Lambda 표현식으로 간소화

FileFilter는 함수형 인터페이스이므로 Lambda로 더 간결하게 작성할 수 있습니다.

public static void lambdaFilter(File dir) {
    File[] items = dir.listFiles(f -> f.getName().endsWith(".java") || f.isDirectory());
    if (items == null) return;
    for (File item : items) {
        if (item.isFile()) {
            System.out.println("람다 필터: " + item.getAbsolutePath());
        } else {
            lambdaFilter(item);
        }
    }
}

태그: java File 클래스 파일 입출력 디렉터리 탐색 재귀

8월 8일 13:55에 게시됨