2012-07-07 26 views
5

Tôi đang sử dụng Java 7 WatchService để xem các thư mục. Tôi liên tục thay đổi những thư mục tôi đang xem. Tôi chạy vào ngoại lệ:Phát hành tài nguyên của Java 7 WatchService

java.io.IOException: Đã đạt đến giới hạn lệnh mạng BIOS.

sau 50 thư mục. Tôi chắc chắn tôi gọi close() trên mỗi WatchService tôi tạo trước khi tạo một cái mới.

Có ai biết cách thích hợp để phát hành WatchService để bạn không chạy vào giới hạn này không?

Cảm ơn,

Dave

Trả lời

3

Tôi nghĩ rằng tất cả bạn cần làm là close() dịch vụ. Tôi biết bạn nói rằng bạn nghĩ rằng bạn đã làm điều này rồi, nhưng tôi nghi ngờ rằng bạn đang thiếu một số. Ví dụ, bạn có thể không đóng các thể hiện dịch vụ trong trường hợp ngoại lệ. Bạn nên xử lý một cá thể WatchService như các tài nguyên IO khác và đóng nó trong một khối cuối cùng; ví dụ.

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

hoặc sử dụng cú pháp Java "try with resource".

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

Khi đóng WatchService, ngay lập tức nó phải giải phóng mọi tài nguyên cấp O/S mà nó nắm giữ.


Khả năng duy nhất khác là bạn đã gặp phải một số lỗi Java trong triển khai WatchService.

1

Nếu tôi đọc quyền Javadoc, bạn chỉ cần một WatchService, mà bạn khởi tạo vào lúc bắt đầu và đóng() ở cuối ứng dụng.

Bạn gửi qua .register đường dẫn và sự kiện bạn muốn đăng ký một lần và lấy lại WatchKey. Bạn giữ những WatchKeys xung quanh, có lẽ trong một ConcurrentMap keyed by Path.

Khi bạn muốn xóa một, chỉ cần gọi hủy() trên WatchKey và xóa khỏi Bản đồ.

WatchService

Path.Register

WatchKey

Các vấn đề liên quan