홈>
필요한 것은 폴더 이름 패턴을 기반으로 하위 폴더 (모든 레벨에서) 및 해당 컨텐츠를 식별하고 삭제하기 위해 일련의 폴더를 순회하는 것입니다. Java 7의 방문자 클래스를 사용하여 작업 코드를 가지고 있지만 Java 8 스트림에서 작동하도록하려고합니다.
일하는 코드를 만들었지 만 (아래 참조), 반복하지 않고 더 좋고 더 간단한 방법을 사용해야한다는 인상을 받았습니다.
public void delete(List<Path> folders) {
folders
.stream()
.filter(Files::isDirectory)
.forEach(this::evaluateIfTrash);
}
private void evaluateIfTrash(Path folder) {
try (Stream<Path> dir = Files.walk(folder, FileVisitOption.FOLLOW_LINKS)) {
dir.filter(Files::isDirectory)
.filter(TrashPredicate::isTrashFolder)
.forEach(this::recursivelyDelete);
} catch (IOException e) {
log.error("Failed to evaluate {}", folder, e);
}
}
private void recursivelyDelete(Path folder) {
try (Stream<Path> dir = Files.walk(folder, FileVisitOption.FOLLOW_LINKS)) {
dir.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.filter(File::exists)
.forEach(File::delete);
} catch (IOException e) {
log.error("Failed to delete {}", folder, e);
}
}
여기에서 몇 가지 문서와 몇 가지 답변을 읽은 후 중복 스트림을 제거하는 방법으로 중첩 스트림을 시도했습니다.
private void delete(List<Path> folders) {
folders
.stream()
.filter(Files::isDirectory)
.flatMap(
f -> {
try {
return Files.walk(f, FileVisitOption.FOLLOW_LINKS);
} catch (IOException e) {
return Stream.empty();
}
})
.filter(TrashPredicate::isTrashFolder)
.forEach(this::recursivelyDelete);
}
private void recursivelyDelete(Path folder) {
try (Stream<Path> dir = Files.walk(folder, FileVisitOption.FOLLOW_LINKS)) {
dir.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.filter(File::exists)
.forEach(File::delete);
} catch (IOException e) {
log.error("Failed to delete {}", folder, e);
}
}
이 방법은 (가독성이 좋지 않은 경우에도) 메소드 중 하나를 제거하지만 실제로 내가 싫어하는 것은 flatMap 연산에 의해 반환 된 내부 스트림을 닫지 않는다는 사실입니다. 리소스를 사용하여 try-with-resource 구문을 사용하고 필터 내에서 forEach 작업을 이동하여 시도하면 스트림이 이미 닫혀 있고 추가 작업에 사용할 수 없다는 오류가 표시됩니다.
지난 2 일 동안이 작업을 성공시키지 않고 노력해 왔기 때문에 다시 질문은 Java 8을 사용하여이 작업을 수행하는 더 나은 (깨끗한) 방법이 있습니까?
- 답변 # 1
관련 자료
- sql server - 행 수준 보안 삭제 블록 술어 및 계단식 삭제 제약 문제
- math - 파워에 대한 프롤로그 테일 재귀 헬퍼 술어
- batch file - 일정에 따라 프로그래밍 방식으로 가변 폴더의 모든 내용 삭제
- r - 조건에 따라 컬럼 값을 삭제하고 다른 컬럼 수를 늘리는 방법
- Autodesk A360에서 항목, 폴더 및 프로젝트 삭제
- cmd - 특정 방식으로 시작하는 일괄 삭제 폴더
- jenkins - Jenkinsfile에서 폴더를 삭제하는 방법?
- javascript - 재귀 정리 기능을 사용하는 동안 배열에서 빈 인스턴스를 삭제하는 방법은 무엇입니까?
관련 질문
- java : 이 code는 if 문이 너무 많기 때문에 읽기가 쉽지 않습니다. 이것을 더 읽기 쉽게 만드는 방법은 무엇입니까?
- java : 비밀 키를 삭제하면 실패한 예외 삭제?
- 논리 유형으로 Java 8 날짜가있는 Avro
- 여러 스레드가 JAVA에서 NIO를 사용하여 콘텐츠를 추가하려고 할 때 파일을 잠 가야합니까?
- Java 8 최대 날짜 시간 객체로 목록에서 객체를 얻는 방법
- java : Collectors.groupby ()를 사용하는 동안 스트림에서 객체를 반복하는 방법
- Java 8에서 findAny ()와 findFirst ()의 차이점
- Java8 : 람다 및 오버로드 된 메서드의 모호성
- java : Thread.sleep에 대한 메서드 참조가 모호합니다.
- Java 8의 java.time API에서 시간 조롱
Files.walk는 루트 경로를 재귀 적으로 먼저 먼저 스트리밍합니다. 아파치 커먼즈의 FileUtils에는 deleteDirectory가있어 디렉토리를 재귀 적으로 제거하여 코드를 매우 깨끗하게 만듭니다.
아래와 같은 것이 작동해야합니다