2010-01-29 36 views
42

Tôi nhận được một URL định vị tệp cục bộ (thực tế là tôi nhận được URL không nằm trong tầm kiểm soát của mình). URL được thoát hợp lệ như được định nghĩa trong RFC2396. Làm thế nào tôi có thể chuyển đổi nó thành một đối tượng Tệp Java?Java: cách lấy Tệp từ URL thoát?

Funnily đủ, phương pháp này getfile URL() trả về một String, không phải là một tập tin.

Tôi đã tạo thư mục có tên "/ tmp/some dir" (có ký tự khoảng cách giữa "một số" và "dir"), được định vị chính xác theo URL sau: "tệp: /// tmp/một số% 20dir "(dấu ngoặc kép được thêm vào để rõ ràng).

Làm cách nào để chuyển đổi URL đó thành tệp Java?

Để cung cấp chi tiết hơn về vấn đề của tôi, các bản in sau sai:

URL url = new URL("file:///tmp/some%20dir"); 
File f = new File(url.getFile()); 
System.out.println("Does dir exist? " + f.exists()); 

Trong khi sau (bằng tay thay thế "% 20" với một không gian) in đúng:

URL url = new URL("file:///tmp/some%20dir"); 
File f = new File(url.getFile().replaceAll("%20", " ")); 
System.out.println("Does dir exist? " + f.exists()); 

Lưu ý rằng Tôi không yêu cầu lý do tại sao ví dụ đầu tiên in sai hoặc lý do tại sao ví dụ thứ hai bằng cách sử dụng hack của tôi replaceAll in true, tôi hỏi ho w để chuyển đổi URL đã thoát thành đối tượng Tệp Java.

EDIT: cảm ơn tất cả, điều này gần như là một sự lừa gạt nhưng không chính xác.

ngớ ngẩn tôi đang tìm kiếm một phương pháp helper bên trong lớp URL đó.

Các công trình sau đây như mong đợi để có được một file Java từ một URL Java:

URL url = new URL("file:///home/nonet/some%20dir"); 
File f = new File(URLDecoder.decode(url.getFile(), "UTF-8")); 
+0

Xem thêm http://weblogs.java.net/blog/kohsuke/archive/2007/04/how_to_convert.html cho một lời cảnh báo. – Vadzim

Trả lời

19
URLDecoder.decode(url);//deprecated 
URLDecoder.decode(url, "UTF-8"); //use this instead 

Xem câu hỏi liên quan How do you unescape URLs in Java?

+0

Phương pháp này không được chấp nhận. Sử dụng tên miền này thay vì http://stackoverflow.com/questions/213506/java-net-urlencoder-encodestring-is-deprecated-what-should-i-use-instead –

+2

Nếu URL được mã hóa RFC2396 (ví dụ: URL đến từ 'file.toURI()' hoặc 'URI mới (" tệp ", null, file.getPath(), null)'), sau đó ** không ** giải mã nó bằng [URLDecoder] (http://docs.oracle) .com/javase/7/docs/api/java/net/URLDecoder.html)! Ví dụ, nếu tập tin là "' main.C++ '", thì URLDecoder sẽ giải mã nó như là "' main.c '". URLDecoder chỉ được sử dụng để giải mã các biểu mẫu gửi HTML. Điều này được đề cập ở cuối [URL javadoc] (http://docs.oracle.com/javase/7/docs/api/java/net/URL.html). – yonran

64

Các File constructor taking an URI kết hợp với URL#toURI() nên làm việc:

URL url = getItSomehow(); 
File file = new File(url.toURI()); 
+1

+1, điều này thật tuyệt vời. – SyntaxT3rr0r

+0

Bạn được chào đón. Tại sao điều này sau đó không được chấp nhận bằng cách này? : o – BalusC

+0

Vâng ... bạn chỉ trả lời một phần về việc nhận tệp từ URL. Nhưng hey, sự lựa chọn của OP là câu trả lời mà anh ấy nghĩ là * hữu ích nhất. –

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