2009-07-15 29 views
16

Hệ thống tôi đang chạy là Windows XP, với JRE 1.6.Java: File.toURI(). ToURL() trên tệp Windows

Tôi làm điều này:

public static void main(String[] args) { 
    try { 
     System.out.println(new File("C:\\test a.xml").toURI().toURL()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }  
} 

và tôi có được điều này: file:/C:/test%20a.xml

Tại sao các URL đã cho không có hai dấu gạch chéo trước C:? Tôi mong đợi file://C:.... Đó là hành vi bình thường?


EDIT:

Từ mã nguồn Java: java.net.URLStreamHandler.toExternalForm (URL)

result.append(":"); 
    if (u.getAuthority() != null && u.getAuthority().length() > 0) { 
     result.append("//"); 
     result.append(u.getAuthority()); 
    } 

Dường như phần Authority của một URL tập tin là null hoặc trống rỗng, và do đó dấu gạch chéo kép bị bỏ qua. Vậy phần thẩm quyền của URL là gì và nó có thực sự vắng mặt trong giao thức tệp không?

+0

Tôi thực sự hy vọng rằng bạn đặt dấu cách trước '{' s ... – Zifre

+0

Bạn đang chạy phiên bản Windows nào? Trên thực tế không quan trọng nếu bạn có thể phân tích cú pháp ngược lại bằng URL mới (Chuỗi). – akarnokd

+0

@ kd304: cũng quan trọng nếu tôi phân tích cú pháp kết quả bằng một thứ khác với URL (Chuỗi), mà tôi làm. – glmxndr

Trả lời

12

Đó là một câu hỏi thú vị.

Điều đầu tiên trước tiên: Tôi nhận được kết quả tương tự trên JRE6. Tôi thậm chí nhận được rằng khi tôi lop off toURL() một phần.

RFC2396 không thực sự yêu cầu hai dấu gạch chéo. Theo phần 3:

Cú pháp URI phụ thuộc vào sơ đồ . Nói chung, tuyệt đối URI là viết như sau:

<scheme>:<scheme-specific-part> 

Có nói rằng, RFC2396 đã được thay thế bởi RFC3986, trong đó nêu

Cú pháp URI chung bao gồm một chuỗi thứ bậc của omponents được gọi là lược đồ, quyền hạn, đường dẫn, truy vấn và đoạn.

URI   = scheme ":" hier-part [ "?" query ] [ "#" fragment ] 

    hier-part = "//" authority path-abempty 
      /path-absolute 
      /path-rootless 
      /path-empty 

Đề án và đường dẫn thành phần được yêu cầu, mặc dù con đường có thể rỗng (không có ký tự). Khi thẩm quyền là hiện tại, đường dẫn phải trống hoặc bắt đầu bằng ký tự gạch chéo ("/"). Khi không có quyền, đường dẫn không thể bắt đầu bằng hai dấu gạch chéo ký tự ("//"). Những hạn chế này dẫn đến năm quy tắc ABNF khác nhau cho đường dẫn (Phần 3.3), chỉ một trong số sẽ khớp với bất kỳ tham chiếu URI nào đã cho.

Vì vậy, có bạn đi.Vì các URI tệp không có phân đoạn quyền, chúng bị cấm bắt đầu bằng //. Tuy nhiên, RFC không đến khoảng năm 2005 và tài liệu tham khảo Java RFC2396, vì vậy tôi không biết tại sao nó tuân theo quy ước này, vì URL của tệp trước khi RFC mới luôn có hai dấu gạch chéo.

+0

Có nhưng: http://tools.ietf.org/html/rfc1738. Phần 3.10 cho tôi biết các tệp phải có dấu gạch chéo kép trong URL. – glmxndr

+0

Và ví dụ ở cuối phần 1.1 của RFC3986 có ví dụ này: tệp: /// etc/hosts. – glmxndr

+0

Tôi cũng nhận thấy điều đó. Đôi khi tôi nghĩ rằng họ chỉ nên làm cho các thông số kỹ thuật dễ đọc hơn. – Powerlord

1

Theo như việc sử dụng nó trong trình duyệt, điều đó không quan trọng. Tôi thường thấy file:///... nhưng một, hai hoặc ba '/' sẽ hoạt động. Điều này làm cho tôi suy nghĩ (mà không cần nhìn vào tài liệu java) rằng nó sẽ là hành vi bình thường.

+1

Tôi hiểu 3 dấu gạch chéo: // +/C: hợp lý. Vấn đề là tôi không sử dụng trình duyệt. – glmxndr

+0

3 Dấu gạch ngang có ý nghĩa trên hệ thống kiểu UNIX; dấu gạch chéo thứ ba là thư mục gốc. file: /// etc/passwd là tập tin/etc/passwd. – Powerlord

2

Để trả lời lý do tại sao bạn có thể có cả hai:

file:/path/file 
file:///path/file 
file://localhost/path/file 

RFC3986 (3.2.2. Host) trạng thái:

"Nếu giao thức URI xác định một mặc định cho máy chủ, sau đó mặc định áp dụng khi các tiểu hợp phần chủ là undefined hoặc Ví dụ, lược đồ URI "tệp" được định nghĩa sao cho không có thẩm quyền, máy chủ trống và "localhost" nghĩa là máy của người dùng cuối, trong khi lược đồ "http" xem xét thiếu quyền hoặc máy chủ lưu trữ trống không hợp lệ ".

Vì vậy, lược đồ "tệp" dịch file:///path/file để có ngữ cảnh của máy của người dùng cuối mặc dù cơ quan là máy chủ trống.

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