2013-08-08 29 views
10

Các tài liệu của DirectoryStream nêu rõ:lặp lại một DirectoryStream và thay đổi nội dung của một thư mục cùng lúc

Các iterator là yếu nhất quán. Đó là chủ đề an toàn nhưng không đóng băng thư mục trong khi lặp lại, vì vậy nó có thể (hoặc có thể không) phản ánh cập nhật cho thư mục xảy ra sau khi DirectoryStream được tạo .

Trên máy của tôi, tôi đã thực hiện lặp lại đơn giản qua thư mục ở chế độ gỡ lỗi. Trước khi lặp lại hoàn thành, tôi đã phá vỡ thực hiện, thêm một tập tin vào thư mục đang được lặp lại và tiếp tục. Lặp lại không thấy tệp bổ sung.

Câu hỏi của tôi: trong trường hợp nào sẽ lặp lại phản ánh cập nhật cho nội dung thư mục? Thật không may là tài liệu chính thức rất mơ hồ về nó. Để nói rằng ít nhất.

+2

Tôi không biết, nhưng cách tôi đọc nó, nó là không xác định, và có thể phụ thuộc vào hệ điều hành/FS cơ bản và triển khai cụ thể. Đoán tốt nhất của tôi là nó sẽ phản ánh các bản cập nhật nếu thư mục của bạn nằm trên một inode nằm sau trong cây so với cái hiện tại mà trình vòng lặp đang trỏ đến. Cách kích động hành vi này mà tôi không biết. Tôi cảm thấy tự tin khi nói rằng nó không thể ngay lập tức (theo một cách xác định) bằng cách sử dụng Java thuần túy. –

Trả lời

4

Tài liệu cố ý mơ hồ. JVM phải chạy trên một số loại máy khác nhau: Windows và các dẫn xuất Unix. Các hệ thống tệp khác nhau có các hành vi khác nhau. Bạn phải (tôi lặp lại, PHẢI) thiết kế cho trường hợp xấu nhất nếu bạn muốn chương trình của bạn hoạt động đáng tin cậy trên nhiều máy tính.

Luật ít ngạc nhiên nhất là bạn nên ẩn toàn bộ DirectoryStream để có ảnh chụp nhanh (hoặc rất gần với một), lặp qua ảnh chụp nhanh, sau đó quét lại luồng. Sau đó bạn có thể so sánh các phiên bản khác nhau của ảnh chụp nhanh để xác định các thay đổi đối với thư mục cơ bản.

+0

Tôi hoàn toàn đồng ý với kết luận, câu hỏi đã hết lợi ích học tập. – Vitaliy

2

DirectoryStream là một giao diện, và vì phần này của NIO.2 được dự định là có thể cắm được, không giới hạn sự xem xét của bạn đối với các triển khai đi kèm với JDK cho Linux và Windows. Nó sẽ khá tốt để viết một triển khai tùy chỉnh với chính xác hành vi đó, hoặc cho một thực hiện phân cụm hoặc phân tán để có hành vi đó như là một tác dụng phụ.

Các tài liệu là cố ý mơ hồ, và theo POSIX nó đại biểu readdir đó là also intentionally vague:

Nếu một tập tin được lấy ra từ hoặc thêm vào thư mục sau khi cuộc gọi gần đây nhất để opendir() hoặc rewinddir (), cho dù một cuộc gọi tiếp theo để readdir_r() trả về một mục nhập cho tập tin đó là không xác định.

Tuy nhiên, nếu bạn là sau khi một trường hợp cụ thể mà một thực hiện dựa trên sự mơ hồ đó, sau đó Linux ext3 readdir and concurrent updates cho thấy một trường hợp rsync, trên một hệ thống ext3 tập tin với số lượng lớn, xuất hiện để xem các file xuất hiện trong thư mục bên ngoài thứ tự chúng được tạo ra.

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