잡담 java쟁이인데 뭐 이거저거 구현하기 귀찮으면 AI쓰는게 훨씬 편함.
페이지 정보
본문
Java 1.8 기준 특정 루트경로 하위의 퍼일 목록을 읽어 삭제하는 프로그램을 작성하고싶어. 루트 하위 폴더는 무시하고 파일의 속성을 읽어서 만들어진지 24시간 이상 경과한 파일을 대상으로 삭제하게 예제 코드를 만들어줘
Java 8(NIO.2)의 java.nio.file 패키지를 사용하면 파일 시스템에 효율적으로 접근하여 속성을 읽고 제어할 수 있습니다.
핵심 구현 로직
Files.list(Path): 지정된 경로의 직계 자식(파일 및 디렉토리)만 스트림으로 읽어옵니다. (하위 폴더 탐색 제외)Files.isRegularFile(Path): 디렉토리를 제외하고 일반 파일만 필터링합니다.Files.readAttributes(): 파일의 생성 시간(creationTime)을 포함한 기본 속성을 읽습니다.Instant및ChronoUnit: 현재 시간으로부터 24시간 전의 시점을 계산하여 비교합니다.
예제 코드
Java
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.stream.Stream;
public class FileDeleteExecutor {
public static void main(String[] args) {
// 대상 루트 경로 설정
Path rootPath = Paths.get("C:/target/directory");
deleteOldFiles(rootPath);
}
public static void deleteOldFiles(Path rootDir) {
// 1. 현재 시각 기준 24시간 전 계산
Instant threshold = Instant.now().minus(24, ChronoUnit.HOURS);
// 2. Files.list를 사용하여 루트 하위 목록 생성 (try-with-resources로 스트림 자동 닫기)
try (Stream<Path> stream = Files.list(rootDir)) {
stream
.filter(Files::isRegularFile) // 디렉토리는 제외하고 파일만 대상
.filter(path -> isCreatedBefore(path, threshold)) // 생성 시간 조건 체크
.forEach(FileDeleteExecutor::deleteFile); // 삭제 실행
} catch (IOException e) {
System.err.println("경로를 읽는 중 오류 발생: " + e.getMessage());
}
}
private static boolean isCreatedBefore(Path path, Instant threshold) {
try {
// 3. 파일의 생성 시간(CreationTime) 속성 추출
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
Instant creationTime = attrs.creationTime().toInstant();
// 생성 시간이 기준점(24시간 전)보다 이전인지 확인
return creationTime.isBefore(threshold);
} catch (IOException e) {
System.err.println("파일 속성을 읽을 수 없음: " + path.getFileName());
return false;
}
}
private static void deleteFile(Path path) {
try {
Files.delete(path);
System.out.println("삭제 성공: " + path.getFileName());
} catch (IOException e) {
System.err.println("삭제 실패: " + path.getFileName() + " - " + e.getMessage());
}
}
}근데 개발일 십수년 하는동안 한번도 안써본 Instant나 ChronoUnit같은거 알려주니까 재밌네.
난 내내 Date 타입이나 Calendar 인스턴스 갖다가 썼거든.
SI하면서 중요한건 결국 DB처리라서 이런 소스코드는 어디서 뭘 하는지만 대충 눈치로 때려맞추고 갖다가 쓸 수 있으면 장땡이란 말야.
그리고 이거 구현하는것보다 인터넷 안되는 환경이라 스프링 쿼츠 크론탭 라이브러리 환경 맞추는데 3시간쯤 걸린게 더 고생했다는거.
댓글목록
북루리님의 댓글
북루리
작성일
요즘같은 세상에 인터넷 안되는데서 작업하는게 존나 고난이도네.
캣타워🐱님의 댓글의 댓글
캣타워🐱
원글
작성일
그래서 실제로 AI가 암만 도입되어도 저런 AI코드중에 뭘 발췌해서 적용해야하는지 알만한 중급이상만 채용되는게 공공기관입지요....