[java] Java에서 파일 변경 리스너

파일 시스템에서 파일이 변경되었을 때 알림을 받고 싶습니다. lastModified File 속성을 폴링하는 스레드 만 발견했으며이 솔루션은 최적이 아닙니다.



답변

낮은 수준에서이 유틸리티를 모델링하는 유일한 방법은 디렉터리에서 스레드를 폴링하고 파일의 속성을 감시하는 것입니다. 그러나 패턴을 사용하여 이러한 유틸리티 용 어댑터를 개발할 수 있습니다.

예를 들어 Tomcat 등의 j2ee 애플리케이션 서버에는 배포 설명자가 변경되거나 서블릿 클래스가 변경되는 즉시 애플리케이션이 다시 시작되는 자동로드 기능이 있습니다.

대부분의 tomcat 코드는 재사용 가능하고 오픈 소스이므로 이러한 서버의 라이브러리를 사용할 수 있습니다.


답변

이전에 로그 파일 모니터를 작성했는데, 1 초에 몇 번씩 단일 파일의 속성을 폴링 할 때 시스템 성능에 미치는 영향이 실제로 매우 작다는 것을 발견했습니다.

Java 7, NIO.2의 일부로 WatchService API 가 추가되었습니다.

WatchService API는 파일 변경 이벤트에 대한 알림을 받아야하는 애플리케이션을 위해 설계되었습니다.


답변

Apache Commons의 VFS API를 사용합니다. 다음은 성능에 큰 영향을주지 않고 파일을 모니터링하는 방법의 예입니다.

DefaultFileMonitor


답변

Linux에서 inotify 를 래핑 하고 Windows도 지원하는 jnotify 라는 lib 가 있습니다. 한번도 사용하지 않았고 얼마나 좋은지 모르겠지만 시도해 볼 가치가 있습니다.


답변

Java commons-io에는 FileAlterationObserver가 있습니다. FileAlterationMonitor와 결합하여 폴링을 수행합니다. Commons VFS와 유사합니다. 장점은 종속성이 훨씬 적다는 것입니다.

편집 : 더 적은 종속성은 사실이 아니며 VFS의 경우 선택 사항입니다. 그러나 VFS 추상화 계층 대신 Java 파일을 사용합니다.


답변

“더 많은 NIO 기능”에는 기본 OS에 따라 구현되는 파일 감시 기능이 있습니다. JDK7에 있어야합니다.


답변

속성 파일을 읽을 때마다이 코드 조각을 실행하고, 마지막으로 읽은 이후 수정 된 파일 만 실제로 읽습니다. 이것이 누군가를 돕기를 바랍니다.

private long timeStamp;
private File file;

private boolean isFileUpdated( File file ) {
  this.file = file;
  this.timeStamp = file.lastModified();

  if( this.timeStamp != timeStamp ) {
    this.timeStamp = timeStamp;
    //Yes, file is updated
    return true;
  }
  //No, file is not updated
  return false;
}

비슷한 접근 방식이 Log4J에서 사용됩니다 FileWatchdog.