2013-05-06 42 views
12

Tôi đang thực hiện một số nghiên cứu về Java NIO.2 và các hoạt động tập tin của nó, và hiện tại tôi đang chơi với các chức năng và lớp học đi bộ.Tại sao loại tệp NIO.2 FileVisitor là chung?

NIO.2 FileVisitor API thật tuyệt vời, thật đáng tiếc là điều đó đã được thêm vào Java SE chỉ gần đây, không phải mười năm trước. Tuy nhiên, có một cái gì đó mà làm phiền tôi một chút: làm thế nào để làm cho giao diện FileVisitor chung?

Mỗi ví dụ đơn lẻ trên mạng cho biết cách sử dụng nó với Files.walkFileTree() ngụ ý rằng chúng tôi đang sử dụng loại FileVisitor<Path>. Nhưng tôi không thể thấy bất kỳ việc sử dụng nào cho giao diện này cho những thứ khác ngoài Path. Vâng, có thể sử dụng để sử dụng FileVisitor để đi bộ các loại cây khác (trong bộ nhớ?), Nhưng điều này không cảm thấy đúng: giao diện này và các lớp liên quan có tên rất cụ thể về mặt ngữ nghĩa gắn với tệp và Phương pháp của FileVisitor ném IOException s.

Vì vậy, có bất kỳ lý do nào để tham số FileVisitor không?

+0

Đầu cơ: 'FileVisitor' cũng có thể sử dụng được các hệ thống tệp khác, ví dụ: [HDFS] (http://en.wikipedia.org/wiki/HDFS#Hadoop_Distributed_File_System). – ValarDohaeris

Trả lời

5

Với generics cùng một giao diện có thể được sử dụng cho các loại khác của đường dẫn. Như được hiển thị trong đoạn mã sau (được đơn giản hóa), giao diện hoạt động tốt với java.io.File:

FileVisitResult walk(File file, FileVisitor<File> visitor) 
    throws IOException 
{ 
    if (file.isDirectory()) { 
     visitor.preVisitDirectory(file, null); 
     for (File child : file.listFiles()) { 
      walk(child, visitor); 
     } 
     return visitor.postVisitDirectory(file, null); 
    } else { 
     return visitor.visitFile(file, null); 
    } 
} 
+0

Vâng, đó là chính xác những gì tôi nghĩ về vài phút sau khi tôi đã viết câu hỏi, rằng nó có thể áp dụng 'FileVisitor' để thường xuyên' File '. –

+0

Nhưng 'null' là đối tượng thuộc tính trông buồn ... –

5

Bạn có sử dụng GitHub không? Đây sẽ là cơ hội hoàn hảo để sử dụng FileVisitor để triển khai API cho GitHub cho phép bạn khám phá/hình dung các dự án GitHub. Đối với vấn đề đó, hầu như bất kỳ hệ thống SCC nào cũng có thể sử dụng một lớp khác làm định vị tệp

Và cách sử dụng FileVisitor<ZipEntry> để duyệt qua các tệp zip.

Nếu một API có khả năng sử dụng được với nhiều đối tượng làm mục tiêu của nó, điều đó chỉ có ý nghĩa để làm cho nó trở nên chung chung. Tôi nghĩ rằng không phải là làm cho nó chung chung sẽ là sai lầm mà nên được coi là ngu ngốc.

+0

Cảm ơn, VCSes thực sự là ví dụ rất tốt về ứng dụng 'FileVisitor'. Tuy nhiên, giao diện 'FileVisitor' trông thực sự là một nửa; có, nó được tham số hóa bởi * path * type, nhưng tại sao nó cũng không được tham số hóa bởi * attribute * type? Nó luôn sử dụng 'BasicFileAttributes'. 'IOException' cũng có vẻ hạn chế. Và cũng 'FileVisitor ' sẽ yêu cầu một số logic phức tạp vì cấu trúc tệp ZIP được cung cấp bởi 'ZipInputStream' là bằng phẳng và có thể không chứa các mục theo thứ tự đúng. –

+0

@VladimirMatveev - Các thuộc tính nào bạn sẽ trình bày từ một VCS Mercurial/Git/SVN? Nó sẽ không khác biệt đáng kể so với HFS? Ngoài ra, các tệp zip không hề phẳng. Bạn có thể có tương đương với các thư mục trong các khóa - chúng là các tệp zip. Zip một tập tin zip trong một zip và bạn có tương đương với một thư mục. – OldCurmudgeon

+0

Vâng, các hệ thống tệp VCS có thể cung cấp thông tin sửa đổi cho mỗi tệp, khác biệt, thay đổi nhật ký v.v. - tất cả điều này là metainformation, phải không? Và các tệp zip bên trong các tệp zip thực sự kỳ lạ, không bao giờ gặp chúng trong thực tế. AFAIK tất cả các trình lưu trữ hiện tại đại diện cho các thư mục như các đường dẫn được phân tách bằng dấu gạch chéo. Tuy nhiên, điều này không làm hỏng ví dụ, các kho lưu trữ như vậy thực sự có thể mô hình hóa hệ thống tập tin. –