2012-01-09 16 views
26

Tàu Java7 có triển khai Path mặc định cho tệp cục bộ. Có triển khai Đường dẫn cho URL không?java.nio.file.Path cho URL?

Ví dụ, tôi sẽ có thể sao chép một nguồn tài nguyên từ xa bằng cách sử dụng đoạn mã sau:

Path remote = Paths.get(new URI("http://www.example.com/foo/bar.html")); 
Path local = Paths.get(new URI("/bar.html")); 
Files.copy(remote, local); 

Hiện nay, điều này ném java.nio.file.FileSystemNotFoundException: Provider "http" not installed. Tôi có lẽ có thể thực hiện điều này bản thân mình nhưng tôi không muốn phát minh lại bánh xe.

+0

Điều gì xảy ra với Files.copy (InputStream, Path)? URL của có phải là một con đường dẫn vào thế giới đó là web không? Hay chúng giống con trỏ hơn? Bạn có khả năng đạt được điều gì? –

+0

@owlstead, Thư viện của tôi cần trả lại Đường dẫn mờ cho người dùng. Họ có thể sao chép các đường dẫn (chỉ đọc) này vào hệ thống tệp cục bộ mà không cần phải biết hoặc quan tâm liệu tệp có nằm cục bộ (tức là trong cơ sở dữ liệu) hoặc từ xa (máy chủ web) hay không. InputStreams thiếu thuộc tính tôi muốn cung cấp cho người dùng của tôi, chẳng hạn như tên tệp hoặc dấu thời gian LastModified. – Gili

+0

Đã hiểu, nhưng những gì người dùng thấy không nhất thiết phải được phản ánh bởi triển khai cơ bản. –

Trả lời

3

Có vẻ như những gì bạn đang thực sự cố gắng làm là hoàn thành những gì FTP làm - sao chép các tập tin từ nơi này sang nơi khác. Tôi sẽ đề nghị bạn tìm cách tốt hơn để làm điều này với các thư viện mã FTP hiện có.

URI không phải là đường dẫn hệ thống tệp nên bạn không thể xử lý chúng như vậy. Chúng là các địa chỉ/các trình định vị tài nguyên, khi bạn đến đó với trình duyệt của bạn (hoặc một trình khách khác xử lý chúng), chúng kích hoạt một số hành động như được định nghĩa bởi máy chủ phía sau chúng. Không có tiêu chuẩn cho những gì máy chủ đó làm, do đó sự linh hoạt của các dịch vụ web. Do đó, nếu máy chủ của bạn đang thực hiện chấp nhận các yêu cầu HTTP theo cách này để tạo điều kiện cho các bản sao tệp, bạn sẽ phải cuộn bản sao của riêng mình và chuyển dữ liệu tệp vào yêu cầu POST.

Để nói theo cách khác, (1) không xử lý URI như chúng là đường dẫn hệ thống tệp - chúng không, (2) tìm thư viện FTP để sao chép tệp và/hoặc (3) nếu bạn thực sự muốn xây dựng một dịch vụ web thực hiện điều này, trừu tượng hóa các chi tiết của việc sao chép tập tin thông qua một yêu cầu POST. Nếu bạn # 3 hiểu rằng tòa nhà của bạn khá gần với tùy chỉnh và có thể chỉ hoạt động trên một tập hợp con các trang web theo thiết kế cụ thể của bạn (tức là những trang bạn xây dựng cho chính mình). Không có bộ tham số chuẩn hoặc "sao chép tệp" qua lệnh POST mà tôi biết rằng bạn có thể tận dụng để thực hiện "công việc" này - bạn sẽ phải khớp yêu cầu HTTP của mình với dịch vụ web trên phía máy chủ.

+0

Đối với những gì nó có giá trị, ai đó đã cuộn một trình duyệt thư mục HTTP chung tại https://issues.apache.org/jira/browse/VFS-199. Trong trường hợp của tôi, máy chủ web được yêu cầu phải theo một cấu trúc thư mục mà tôi chỉ định vì vậy tôi sẽ cần phải triển khai thực hiện Đường dẫn tương ứng. Cảm ơn bạn đã giúp tôi hiểu lý do tại sao triển khai tùy chỉnh là cần thiết. – Gili

+0

Coolio - vui vì tôi có thể giúp đỡ, và vui vì bạn đã tìm thấy dự án đó. – jefflunt

+0

@normalocity Nó gần như không liên quan và tôi chỉ chụp hình này ở đầu bộ não của tôi, nhưng tôi nghĩ không có phương pháp nào trong Java 7 hiện tại sẽ trả về 'Đường dẫn' cho một tài nguyên _classpath, mà sẽ rất tốt đẹp. Bạn nghĩ gì về điều này? Tôi nghĩ rằng nó sẽ được tốt đẹp, bởi vì một 'Path' là đẹp hơn nhiều so với một' URL'. –

0

Tôi đã phải đối phó với một vấn đề tương tự và đã viết một phương pháp nhỏ để giải quyết vấn đề này, bạn có thể tìm thấy bên dưới.

Nó hoạt động tốt cho việc nối URL và hậu tố tương đối. Cẩn thận không cho hậu tố tuyệt đối vì hành vi của hàm phân giải URI.

private URI resolveURI(String root, String suffix) { 
    URI uri; 
    try { 
     uri = new URI(root + "/").resolve(suffix); 
    } catch (URISyntaxException e) { 
     //log 
    } 
    return uri; 
} 
Các vấn đề liên quan