Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 파일 또는 디렉토리 존재 여부를 확인하는 방법 (NIO vs 레거시 IO)

Java에서 파일이나 디렉토리의 존재 여부를 확인하는 대표적인 방법은 크게 두 가지입니다.

  • NIO 패키지 : java.nio.file.Files 클래스의 exists() 메서드 (Java 7 이상)
  • 레거시 IO 패키지 : java.io.File 클래스의 exists() 메서드

아래에서 각 방식별 예제 코드를 살펴보겠습니다.

Java NIO로 파일 존재 여부 확인하기

NIO 패키지에서는 Paths.get()으로 Path 객체를 생성한 뒤, Files.exists() 메서드로 파일의 존재 여부를 확인합니다.

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CheckFileExist {

    public static void main(String[] args) {

        Path path = Paths.get("/path/to/file/app.log");

        if (Files.exists(path)) {

            if (Files.isRegularFile(path)) {
                System.out.println("앱 로그 파일이 존재합니다");
            }

        } else {
            System.out.println("앱 로그 파일이 존재하지 않습니다");
        }
    }
}

Files.isRegularFile()을 함께 사용하면 해당 경로가 디렉토리가 아닌 일반 파일인지까지 검증할 수 있어 더욱 안전합니다.

Java NIO로 디렉토리 존재 여부 확인하기

디렉토리도 동일한 방식으로 확인하며, 이때는 경로가 실제 디렉토리인지 판단하는 Files.isDirectory() 메서드를 사용합니다.

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CheckDirectoryExist {

    public static void main(String[] args) {

        Path path = Paths.get("/path/to/logs/");

        if (Files.exists(path)) {

            if (Files.isDirectory(path)) {
                System.out.println("로그 디렉토리가 존재합니다");
            }

        } else {
            System.out.println("로그 디렉토리가 존재하지 않습니다");
        }
    }
}

NIO의 exists() 사용 시 주의 사항

  • Files.exists()는 기본적으로 심볼릭 링크를 따라가 링크 대상을 확인합니다. 링크 자체만 확인하려면 LinkOption.NOFOLLOW_LINKS 옵션을 인자로 전달하세요.
  • 파일이 실제로 없는 경우뿐 아니라 접근 권한이 없거나 I/O 오류가 발생한 경우에도 false를 반환할 수 있습니다.
  • "존재하지 않음"을 명확하게 판단하고 싶다면 Files.notExists() 메서드를 사용하는 것이 좋습니다.

레거시 IO(File)로 파일 존재 여부 확인하기

Java NIO를 사용하지 않는 환경이라면 전통적인 java.io.File 클래스의 exists() 메서드를 사용할 수 있습니다.

import java.io.File;

public class CheckFileExists {

    public static void main(String[] args) {

        File file = new File("/path/to/file/app.log");

        if(file.exists()) {
            System.out.println("앱 로그 파일이 존재합니다");
        } else {
            System.out.println("앱 로그 파일이 존재하지 않습니다");
        }
    }
}

레거시 IO로 디렉토리 존재 여부 확인하기

디렉토리 여부는 isDirectory() 메서드로 간단하게 확인할 수 있습니다.

import java.io.File;

public class CheckDirectoryExists {

    public static void main(String[] args) {

        File file = new File("/path/to/logs/");

        if(file.isDirectory()) {
            System.out.println("로그 디렉토리가 존재합니다");
        } else {
            System.out.println("로그 디렉토리가 존재하지 않습니다");
        }
    }
}

마무리 정리

새로운 프로젝트라면 Java 7부터 도입된 NIO 방식(Files.exists)을 사용하는 것이 권장됩니다. 더 풍부한 파일 API와 개선된 예외 처리 등 다양한 장점을 제공하기 때문입니다. 반면, 레거시 코드베이스를 유지보수하거나 Java 6 이하 환경을 지원해야 한다면 File.exists() 방식을 그대로 활용하면 됩니다.