Java 함수식 프로그래밍(12): 파일 수정 모니터링
지정한 디렉터리에 있는 파일을 열거하는 방법을 보았습니다.지정한 디렉터리의 직접 하위 디렉터리 (깊이는 1)를 훑어보는 방법을 살펴보고, 간단한 버전을 구현한 다음, 더욱 편리한flatMap () 방법으로 실현합니다.
우리는 먼저 전통적인 for 순환으로 지정한 디렉터리를 훑어보았다.하위 디렉터리에 파일이 있으면 목록에 추가합니다.그렇지 않으면 하위 디렉터리를 목록에 추가합니다.마지막으로 모든 파일의 총수를 출력합니다.코드는 아래에 있다. 이것은 어려운 모델이다.
public static void listTheHardWay() {
List<File> files = new ArrayList<>();
File[] filesInCurrentDir = new File(".").listFiles();
for(File file : filesInCurrentDir) {
File[] filesInSubDir = file.listFiles();
if(filesInSubDir != null) {
files.addAll(Arrays.asList(filesInSubDir));
} else {
files.add(file);
}
}
System.out.println("Count: " + files.size())
}
우리는 먼저 현재 디렉터리에 있는 파일 목록을 가져와서 두루 훑어보았다.모든 파일에 대해 하위 파일이 있으면 목록에 추가합니다.이렇게 하는 것은 문제없지만, 그것은 몇 가지 흔히 볼 수 있는 문제가 있다. 가변성, 기본 유형의 편견, 명령식, 코드의 지루함 등이다.flatMap()이라는 작은 방법으로 이 문제들을 해결할 수 있다.이 이름이 말한 바와 같이 이 방법은 비치면 편평화된다.이것은 맵 () 처럼 집합 중의 요소를 비추게 됩니다.그러나 맵 () 방법과 달리 맵 () 방법의 lambda 표현식은 하나의 요소만 되돌려주고 여기는 Stream 대상입니다.그래서 이 방법은 여러 개의 유압을 평평하게 하여 안의 모든 원소를 하나의 편평한 흐름에 비춘다.
우리는 flatMap () 으로 각종 조작을 실행할 수 있지만, 현재 가지고 있는 이 문제는 바로 그것의 가치를 설명한다.모든 하위 디렉터리는 파일의 목록이나 흐름을 가지고 있으며, 현재 디렉터리에 있는 모든 하위 디렉터리의 파일 목록을 가져오기를 원합니다.
일부 디렉터리는 비어 있거나 하위 요소가 없을 수도 있습니다.이런 상황에서 우리는 이 빈 디렉터리나 파일을 하나의 흐름 대상으로 포장한다.만약 우리가 어떤 파일을 무시하고 싶다면, JDK의 flatMap () 방법도 빈 파일을 잘 처리할 수 있다.그것은 하나의 빈 인용을 하나의 빈 집합으로 흐름에 통합시킬 것이다.flatMap () 메서드의 사용을 살펴보겠습니다.
public static void betterWay() {
List<File> files =
Stream.of(new File(".").listFiles())
.flatMap(file -> file.listFiles() == null ?
Stream.of(file) : Stream.of(file.listFiles()))
.collect(toList());
System.out.println("Count: " + files.size());
}
현재 디렉터리의 하위 파일 흐름을 가져와서flatMap () 방법을 사용했습니다.그리고 lambda 표현식을 이 방법에 전달합니다. 이 표현식은 지정한 파일의 하위 파일 흐름을 되돌려줍니다.flatMap () 메서드는 현재 디렉터리의 모든 하위 디렉터리에 있는 파일의 집합을 되돌려줍니다.우리는collect () 방법과 Collectors 안의 toList () 방법을 사용하여 그것들을 목록에 수집합니다.flatMap () 에 전달된 이 lambda 표현식은 파일의 하위 파일로 되돌아옵니다.만약 없다면, 이 파일의 흐름을 되돌려줍니다.flatMap () 방법은 우아하게 이 흐름을 하나의 흐름의 집합에 비추고 이 집합을 편평하게 하여 최종적으로 하나의 흐름에 통합시킨다.
flatMap () 방법은 많은 개발 작업을 감소시켰다. 그것은 두 개의 연속적인 조작을 잘 결합시켰다. 이것은 통상적으로 원조라고 부른다. 우아한 조작으로 완성된다.
직접 하위 디렉토리의 모든 파일을 열거하기 위해 flatMap () 방법을 사용하는 방법을 알고 있습니다.다음은 문서의 수정 조작을 감시해 봅시다.
파일 수정 모니터링
우리는 이미 파일과 디렉터리를 찾는 방법을 알고 있지만, 만약 우리가 파일을 만들거나 수정하거나 삭제할 때 알림 메시지를 받을 수 있기를 원한다면, 이것도 매우 간단하다.이런 메커니즘은 일부 특수 파일, 예를 들어 프로필을 감시하는 데 시스템 자원의 변동에 매우 유용하다.다음은 자바 7에 도입된 이 도구, Watch Service를 탐색해 보겠습니다. 이것은 파일의 수정을 감시할 수 있습니다.아래에서 우리가 본 많은 특성은 JDK 7에서 왔는데, 여기서 가장 큰 개선은 내부 교체기가 가져온 편리성이다.
우선 현재 디렉터리의 파일 수정을 감시하는 예를 쓰겠습니다.JDK의 Path 클래스는 관찰자 서비스의 공장인 파일 시스템의 실례에 대응합니다.다음과 같이 이 서비스에 알림 이벤트를 등록할 수 있습니다.
inal Path path = Paths.get(".");
final WatchService watchService =
path.getFileSystem()
.newWatchService();
path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
System.out.println("Report any file changed within next 1 minute...");
우리는 현재 디렉터리의 수정을 관찰하기 위해 Watch Service를 등록했습니다.이 Watch Service를 통해 디렉터리 아래 파일의 수정 작업을 가져올 수 있습니다. WatchKey를 통해 변경 사항을 되돌려줍니다.일단 우리가 이 키를 받게 되면, 파일 업데이트에 대한 상세한 정보를 얻기 위해 모든 이벤트를 훑어볼 수 있습니다.여러 개의 파일이 동시에 수정될 수 있기 때문에poll 작업은 여러 개의 이벤트를 되돌릴 수 있습니다.다음 윤문과 두루 훑어보는 코드를 보십시오.
final WatchKey watchKey = watchService.poll(1, TimeUnit.MINUTES);
if(watchKey != null) {
watchKey.pollEvents()
.stream()
.forEach(event ->
System.out.println(event.context()));
}
여기에서 볼 수 있듯이 자바 7과 자바 8의 특성이 동시에 등장한다.우리는pollEvents () 가 되돌아오는 집합을 자바 8의 Stream으로 바꾸고, 그 내부 교체기를 사용하여 모든 파일의 상세한 업데이트 정보를 출력합니다.이 코드를 실행하고 현재 디렉터리의sample를 실행합니다.txt 파일을 수정해서 이 프로그램이 이 업데이트를 알아차릴 수 있는지 확인하십시오.
Report any file changed within next 1 minute...
sample.txt
우리가 이 파일을 수정했을 때, 프로그램은 파일이 수정되었다고 알릴 것이다.우리는 이 기능으로 서로 다른 파일의 업데이트를 감시하고 해당하는 임무를 수행할 수 있다.물론 우리는 파일을 새로 만들거나 삭제하는 작업만 등록할 수 있다.총결산
lambda 표현식과 방법을 인용한 후 문자열과 파일의 조작, 사용자 정의 비교기 만들기 등 흔히 볼 수 있는 작업은 더욱 간단하고 간결해졌다.익명 내부류도 우아해졌고, 가변성은 일출 후의 아침 안개처럼 흔적도 없이 사라졌다.이런 새로운 스타일로 인코딩을 하는 또 하나의 혜택은 JDK의 새로운 시설을 사용하여 방대한 디렉터리를 효율적으로 훑어볼 수 있다는 것이다.
이제 람다 표현식을 만들고 그것을 전달하는 방법을 알고 있습니다.다음 장에서 우리는 함수식 인터페이스와lambda 표현식을 어떻게 사용하여 소프트웨어의 설계를 하는지 소개할 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.