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.xml 에 commons-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를 사용했습니다.