1. 개요

이 빠른 사용방법(예제)에서는 Java의 특정 디렉터리에서 마지막으로 수정 된 파일을 찾는 방법을 자세히 살펴 보겠습니다.

먼저 레거시 IO최신 NIO API 부터 시작하겠습니다 . 그런 다음 Apache Commons IO 라이브러리를 사용하여 동일한 작업을 수행하는 방법을 살펴 보겠습니다 .

2. java.io API 사용

레거시 java.io 패키지는 파일 및 디렉토리 경로 이름의 추상적 인 표현을 캡슐화하는 File 클래스를 제공합니다 .

고맙게도 File 클래스에는 lastModified () 라는 편리한 메서드가 함께 제공됩니다 . 이 메서드는 추상 경로 이름으로 표시된 파일의 마지막 수정 시간을 반환합니다 .

이제 의도 한 목적을 달성하기 위해 java.io.File 클래스를 사용하는 방법을 살펴 보겠습니다 .

public static File findUsingIOApi(String sdir) {
    File dir = new File(sdir);
    if (dir.isDirectory()) {
        Optional<File> opFile = Arrays.stream(dir.listFiles(File::isFile))
          .max((f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified()));

        if (opFile.isPresent()){
            return opFile.get();
        }
    }

    return null;
}

보시다시피 Java 8 Stream API사용하여 파일 배열을 반복합니다. 그런 다음 max () 작업을 호출 하여 가장 최근에 수정 된 파일을 가져옵니다 .

마지막으로 수정 된 파일을 캡슐화 하기 위해 Optional 인스턴스사용 합니다.

이 접근 방식은 구식이며 구식으로 간주됩니다. 그러나 Java 레거시 IO 세계와의 호환성을 유지하려는 경우 사용할 수 있습니다 .

3. 사용 있는 java.nio의 API를

NIO API의 도입은 파일 시스템 관리의 전환점입니다. Java 7에 포함 새 버전 NIO.2 에는 향상된 파일 관리 및 조작을위한 향상된 기능 세트가 함께 제공됩니다.

사실, java.nio.file.Files 클래스는 Java에서 파일과 디렉토리를 조작 할 때 큰 유연성을 제공합니다.

그래서 우리가 Files 클래스를 사용 하여 디렉토리에서 마지막으로 수정 된 파일을 얻는 방법을 살펴 보겠습니다 .

public static Path findUsingNIOApi(String sdir) throws IOException {
    Path dir = Paths.get(sdir);
    if (Files.isDirectory(dir)) {
        Optional<Path> opPath = Files.list(dir)
          .filter(p -> !Files.isDirectory(p))
          .sorted((p1, p2)-> Long.valueOf(p2.toFile().lastModified())
            .compareTo(p1.toFile().lastModified()))
          .findFirst();

        if (opPath.isPresent()){
            return opPath.get();
        }
    }

    return null;
}

첫 번째 예와 마찬가지로 파일 만 가져 오기 위해 Steam API에 의존합니다. 그런 다음 람다 식 의 도움으로 마지막 수정 시간을 기준으로 파일을 정렬 합니다 .

4. Apache Commons IO 사용

Apache Commons IO는 파일 시스템 관리를 다음 단계로 끌어 올렸습니다. 편리한 클래스, 파일 비교기, 파일 필터 등을 제공합니다.

다행히도 라이브러리는 LastModifiedFileComparator 클래스를 제공합니다.이 클래스 는 마지막 수정 시간을 기준으로 파일 배열을 정렬하는 비교기로 사용할 수 있습니다 .

먼저 pom.xmlcommons-io 의존성 을 추가해야합니다 .

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

마지막으로 Apache Commons IO를 사용하여 폴더에서 마지막으로 수정 된 파일을 찾는 방법을 보여 드리겠습니다.

public static File findUsingCommonsIO(String sdir) {
    File dir = new File(sdir);
    if (dir.isDirectory()) {
        File[] dirFiles = dir.listFiles((FileFilter)FileFilterUtils.fileFileFilter());
        if (dirFiles != null && dirFiles.length > 0) {
            Arrays.sort(dirFiles, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
            return dirFiles[0];
        }
     }

    return null;
}

위와 같이 싱글 톤 인스턴스 LASTMODIFIED_REVERSE사용하여 파일 배열을 역순으로 정렬 합니다.

배열이 역으로 정렬되므로 마지막으로 수정 된 파일이 배열의 첫 번째 요소입니다.

5. 결론

이 예제에서는 특정 디렉토리에서 마지막으로 수정 된 파일을 찾는 다양한 방법을 탐색했습니다. 그 과정에서 JDK 및 Apache Commons IO 외부 라이브러리의 일부인 API를 사용했습니다.

항상 그렇듯이 예제의 전체 코드 소스는 GitHub에서 사용할 수 있습니다 .