자바 함수 식 프로 그래 밍(14)모니터링 파일 수정

이 시 리 즈 는 Venkat Subramaniam 의
Functional Programming in Java
계속 진행 되 지 않 았 습 니 다.다음 글 은[url={site.url}]자바 번역 소[/url]를 계속 주목 하 십시오.
하위 디 렉 터 리 를 flatMap 으로 표시 합 니 다.
지정 한 디 렉 터 리 에 있 는 파일 을 표시 하 는 방법 을 보 았 습 니 다.지정 한 디 렉 터 리 의 직접 하위 디 렉 터 리(깊이 는 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())

}


현재 디 렉 터 리 에 있 는 파일 목록 을 가 져 와 서 옮 겨 다 닙 니 다.모든 파일 에 하위 파일 이 있 으 면 목록 에 추가 합 니 다.이렇게 하 는 것 은 문제 가 없 지만 흔히 볼 수 있 는 문제 가 있다.가 변성,기본 유형 편집,명령 식,코드 가 지루 하 다 는 등 이다.플랫 맵()이라는 작은 방법 으로 이 문제 들 을 해결 할 수 있다.
이 이름 에서 말 한 바 와 같이 이 방법 은 비 친 후에 편평 화 될 것 이다.그것 은 맵()처럼 집합 중의 원 소 를 비 출 것 이다.그러나 map()방법 과 달리 map()방법 에 있 는 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());

}


우 리 는 먼저 현재 디 렉 터 리 의 하위 파일 흐름 을 가 져 온 다음 에 그것 의 flatpap()방법 을 호출 했다.그리고 lambda 표현 식 을 이 방법 에 전달 합 니 다.이 표현 식 은 지정 한 파일 의 하위 파일 흐름 을 되 돌려 줍 니 다.flatpap()방법 은 현재 디 렉 터 리 의 모든 하위 디 렉 터 리 에 있 는 파일 의 집합 을 되 돌려 줍 니 다.우 리 는 collect()방법 과 Collectors 의 toList()방법 을 사용 하여 목록 에 수집 합 니 다.
우리 가 flatpap()에 보 낸 이 lambda 표현 식 은 파일 의 하위 파일 을 되 돌려 줍 니 다.없 으 면 이 파일 의 흐름 을 되 돌려 줍 니 다.flatMap()방법 은 우아 하 게 이 흐름 을 하나의 흐름 의 집합 에 비 친 다음 에 이 집합 을 평면 화하 여 최종 적 으로 하나의 흐름 에 합 친다.
flatpap()방법 은 많은 개발 작업 을 줄 였 습 니 다.두 개의 연속 적 인 조작 을 잘 결합 시 켰 습 니 다.이것 은 보통 원조 라 고 부 릅 니 다.우아 한 조작 으로 완성 되 었 습 니 다.
직접 하위 디 렉 터 리 에 있 는 모든 파일 을 flatpap()방법 으로 나열 하 는 방법 을 알 고 있 습 니 다.다음은 파일 의 수정 작업 을 모니터링 하 겠 습 니 다.
모니터링 파일 수정
파일 과 디 렉 터 리 를 찾 는 방법 은 이미 알 고 있 습 니 다.그러나 파일 을 만 들 거나 수정 하거나 삭제 할 때 알림 메 시 지 를 받 을 수 있다 면 이것 도 매우 간단 합 니 다.이러한 메커니즘 은 일부 특수 파일,예 를 들 어 프로필,시스템 자원 의 변경 을 감시 하 는 데 매우 유용 하 다.다음은 자바 7 에 도 입 된 이 도구,WatchService 를 탐색 해 보 겠 습 니 다.파일 의 수정 을 감시 할 수 있 습 니 다.아래 에서 우리 가 본 많은 특성 은 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...");


우 리 는 현재 디 렉 터 리 의 수정 을 관찰 하기 위해 WatchService 를 등록 했다.이 WatchService 에 문의 하여 디 렉 터 리 에 있 는 파일 의 수정 작업 을 가 져 올 수 있 습 니 다.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 표현 식 을 만 들 고 전달 하 는 방법 을 알 고 있 습 니 다.다음 장 에 서 는 함수 식 인터페이스 와 lambda 표현 식 을 사용 하여 소프트웨어 디자인 을 하 는 방법 을 소개 합 니 다.
계속 진행 되 지 않 았 습 니 다.다음 글 은[url={site.url}]자바 번역 소[/url]를 계속 주목 하 십시오.
오리지널 글 을 전재 할 때 출처 를 밝 혀 주 십시오.
http://it.deepinmind.com

좋은 웹페이지 즐겨찾기