2012-05-30 19 views
1

我希望在連接USB驅動器時收到通知。所以,Java的SAIS:「驅動器H:創建」。 有沒有辦法用WatchService來做到這一點?看着根目錄不起作用。它只是監視當前驅動器的根目錄: Paths.get(「/」)。寄存器Java nio WatchService:觀看Windows驅動器列表

回答

4

你不能用WatchService來做到這一點。由於您只關心Windows,因此只需輪詢FileSystem.getRootDirectories並檢測更改。

try { 
    List<Path> roots = asList(FileSystems.getDefault().getRootDirectories()); 
    for(;;) { 
     Thread.sleep(500); 

     List<Path> newRoots = asList(FileSystems.getDefualt().getRootDirectories()); 
     for(Path newRoot : newRoots){ 
      if(!roots.contains(newRoot)) { 
       System.out.println("New drive detected: " + newRoot); 
      } 
     } 
     roots = newRoots; 
    } 
} catch(InterruptedException e) { 
    e.printStackTrace(); 
    Thread.currentThread().interrupt(); 
} 

如果你想這在其他操作系統上工作,你將不得不輪詢FileSystem.getFileStores並想出一個辦法來get the root path for a FileStore

/E1

private <T> List<T> asList(Iterable<T> i) { 
    if (i instanceof List) { return (List<T>) i; } 

    List<T> l = new ArrayList<>(); 
    for (T t : i) { 
     l.add(t); 
    } 
    return l; 
} 
+0

有什麼'asList'方法? – Supuhstar

+1

我相信這是我前一段時間修改的一段代碼。 'asList'將'Iterable'轉換爲'List',我將其編輯。 – Jeffrey