2012-07-07 17 views
5

Używam Java 7 WatchService do przeglądania katalogów. Ciągle zmieniam katalogi, które oglądam. Wystąpił wyjątek:Uwalnianie zasobów Java 7 WatchService

java.io.IOException: Osiągnięto limit poleceń systemu BIOS.

po 50 katalogach. Jestem pewien, że wywołuję close() na każdej funkcji WatchService, którą utworzę przed utworzeniem nowej.

Czy ktoś zna prawidłowy sposób zwolnienia usługi WatchService, aby nie uruchomić tego limitu?

Dzięki,

Dave

Odpowiedz

3

myślę że wszystko trzeba zrobić, to close() usługa. Wiem, że powiedziałeś, że myślisz, że już to robisz, ale podejrzewam, że czegoś brakuje. Na przykład możesz nie być w stanie zamknąć instancji usługi w przypadku wyjątku. Powinieneś traktować instancję WatchService jako inne zasoby IO i zamknąć ją w bloku finally; na przykład

WatchService ws = ... 
try { 
    // use it ... 
} finally { 
    ws.close(); 
} 

lub użycie składni Java 7 "try with resource".

try (WatchService ws = ...) { 
    // use it ... 
} 

Gdy WatchService jest zamknięta, należy natychmiast zwolnić wszelkie zasoby O/S, że poziom trzyma.


Jedyną inną możliwością jest to, że napotkano błąd Java w implementacji WatchService.

1

Jeśli czytam prawę Javadoc, potrzebna jest tylko jedna usługa WatchService, którą tworzy się na początku i na końcu() na końcu aplikacji.

Przesyłasz przez. Zarejestruj ścieżki i wydarzenia, które chcesz zarejestrować pojedynczo, a następnie wróć do WatchKey. Trzymasz te WatchWeys wokół, być może w ConcurrentMap z kluczem Path.

Jeśli chcesz je usunąć, po prostu wywołaj cancel() na klawiaturze WatchKey i usuń z mapy.

WatchService

Path.Register

WatchKey