2014-03-03 4 views
1

inotify 이벤트를 사용하는 JDK7에서 Watcher를 사용하고 있습니다. 파일이 NFS에 있다면, 프로그램을 폴백하고 대신 폴링을 사용하길 바란다. 파일이 원격 드라이브 (Runtime.exec를 사용하고 마운트 테이블을 구문 분석하는 것 이외의 다른 파일)에 있는지 감지하는 방법이 있습니까? 나는 지금 리눅스 호환성에만 관심이있다.Java에서 원격 파일 감지

하나의 옵션은 프로그램 시작시 inotify와 폴링을 모두 사용하는 것이지만 내 파일에 대한 inotify 이벤트가 생성되면 폴링 스레드를 사용하지 않는 것으로 가정합니다.

+0

당신은 inotify를 시도하고 프로그램 파일을 업데이트 할 수 있습니다. 당신이 이벤트를받는다면, 그렇지 않다면, 폴링으로 전환하십시오. – hoaz

+2

java.nio.file.WatchService 문서는 특별한 경우에 사용할 더 나은 메커니즘이 없다면 시계 서비스 구현이 폴링으로 대체된다는 것을 의미합니다. NFS 파일 시스템에서도 사용할 수 있으며 폴링을 직접 구현할 필요가 없습니다. –

+1

@OlegEstekhin이 답변을해야합니다. –

답변

0

FileStore.type()으로 기본 파일 시스템 유형에 대한 상대적으로 신뢰할 수있는 정보를 얻을 수 있어야합니다.

다른 네트워크 마운트 유형에 대해 확실하지 않은 NFS 또는 CIFS인지 분명히 알려줍니다.

그러나 나는 그것이 얼마나 신뢰할 수 있는지에 대한 정보가 없습니다. 이벤트가 통과하는지 확인하는 @ hoaz의 제안은 좋은 생각 일 수 있습니다.

0

같은 문제가있었습니다. 주 클래스에서 새 스레드를 만들고 파일을 주기적으로 만져서 새로운 변경 이벤트가 시작되면이를 해결했습니다.

샘플은 10 초마다 dir을 폴링합니다. 여기

코드 샘플 :

package com.ardevco.files; 

import java.io.IOException; 
import java.nio.file.DirectoryStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.FileTime; 
import java.util.ArrayList; 
import java.util.List; 

public class Touch implements Runnable { 

    private Path touchPath; 

    public Touch(Path touchPath) { 
     this.touchPath = touchPath; 
     this.checkPath = checkPath; 

    } 

    public static void touch(Path file) throws IOException { 
     long timestamp = System.currentTimeMillis(); 
     touch(file, timestamp); 
    } 

    public static void touch(Path file, long timestamp) throws IOException { 
     if (Files.exists(file)) { 
      FileTime ft = FileTime.fromMillis(timestamp); 
      Files.setLastModifiedTime(file, ft); 
     } 
    } 

    List<Path> listFiles(Path path) throws IOException { 
     final List<Path> files = new ArrayList<>(); 
     try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) { 
      for (Path entry : stream) { 
       if (Files.isDirectory(entry)) { 
        files.addAll(listFiles(entry)); 
       } 
       files.add(entry); 
      } 
     } 
     return files; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       for (Path path : listFiles(touchPath)) { 
        touch(path); 
       } 
      } catch (IOException e) { 
       System.out.println("Exception: " + e); 
      } 

      try { 
       Thread.sleep(10000L); 
      } catch (InterruptedException e) { 
       System.out.println("Exception: " + e); 
      } 
     } 

    } 

}