2012-11-22 2 views
0

디렉토리의 새 파일을 확인하기위한 기본 파일 모니터를 쓰고 있습니다.자바 타이머의 콜백/이벤트

  1. 타이머 변화를 확인하기 위해 TimerTask를 서브 클래스 만들기 : 그래서 난이 여기에있다하지만 일의 권장되는 방법은 내가 생각하고있는 무엇을 모르는 자바 경험을 많이 없어 디렉토리가/새 파일이 나는 자바에 파견 어떤 이벤트를 수행하지만 조금 봤와 많이 발견하지 않았습니다

첨가 하였다 변경 한 경우 디렉토리 경로에

  • 파견 이벤트 /를 TimerTask를 서브 클래스에서 다시 통지 내가 지금 당장은별로 관심이없는 swing/gui 구성 요소를 중심으로 회전하는 결과가 있습니다. Observable 클래스도 살펴 보았습니다.하지만 문제는 두 클래스를 확장 할 수 없기 때문에 할 수없는 TimerTask 하위 클래스에서 알릴 필요가 있다는 것입니다. 프로젝트는 충분히 단순해야하며 기본 콜백 (조건이 충족 될 때 TimerTask 내에서 호출되도록 TimerTask 서브 클래스 외부의 함수에 대한 참조 전달)이 수행해야합니다.

    무엇이 좋습니다? 가장 간단한 방법은 무엇입니까?

  • 답변

    2

    를 해결해야한다.

    이 클래스는 리스너와 화재 이벤트를 이해 관계자에게 추가/제거 할 수 있습니다.

    예 :

    public class FileWatcher { 
    
         private Timer timer; 
    
         public FileWatcher(File path) { 
    
          timer = new Timer("FileWather", true); 
          // Schedule task to start immeditaly and re-fire every second... 
          timer.scheduleAtFixedRate(new FileWatcherTask(), 0, 1000); 
    
         } 
    
         public void addFileWatcherListener(FileWatcherListener listener) { 
          //... 
         } 
    
         public void removeFileWatcherListener(FileWatcherListener listener) { 
          //... 
         } 
    
         protected void fireFileRemoved(File... files) { 
          //... 
         } 
    
         protected void fireFileAdded(File... files) { 
          //... 
         } 
    
         protected void fireFileChanged(File... files) { 
          //... 
         } 
    
         public class FileWatcherTask extends TimerTask { 
    
          @Override 
          public void run() { 
           // Look ma, no hands! 
          } 
    
         } 
    
    } 
    

    지금, 분명히, 당신은 FileWatcherListener 스스로를 정의해야합니다,하지만 기본 개념입니다. 당신이 자바 7을 사용하는 경우

    지금은, 당신은 단지 대신

    +1

    가장 좋은 대답은 FileSystem에서 제공하는 WatchService를 사용하여 답변의 마지막 부분에 있다고 생각합니다.1 + –

    +0

    @HovercraftFullOfEels 동의합니다. 문맥이 없습니다. P가 자바 6을 사용하고 있거나 스스로 연습 할 수 있습니다. – MadProgrammer

    +0

    이것은 멋지게 보입니다 (+1). 예, 자바 6을 사용하고 있습니다. (osx :() –

    2

    이것은 기본적으로 당신이 자기 관리 용기에 TimerTimerTask을 캡슐화하는 래퍼 클래스를 작성할 수 목적

    ActionListener al = new ActionListener() { 
    
          @Override 
          public void actionPerformed(ActionEvent arg0) { 
    
           // Check Your Directory for changes 
          } 
         }; 
    
    Timer t = new Timer(1000,al); // Timer(TimeInMilliSeconds, ActionListener) 1000ms = 1s 
    t.start(); 
    
    +0

    이 어떤 타이머 클래스 인 Watch Service API를 사용할 수 있을까? 'java.util.Timer'를 사용하고 있습니다. –

    +0

    'javax.swing.Timer' –

    +2

    'javax.swing.Timer'가 마음에 들지만,이 컨텍스트 내에서 사용하는 것을 싫어합니다. 파일 디렉토리 (및/또는 하위 디렉토리)를 읽는 것은 프로세스 중 가장 빠르지 않으며 매 초 UI에서 일시 중지를 유발하여 내게 힘이들 것입니다. UI 동기화에 대한 요점은 유효하지만, 대신 SwingUtilities.invokeLater 또는 아마도 SwingWorker를 사용하십시오 – MadProgrammer

    관련 문제