Truyền tệp cục bộ vào URL trong Java


175

Làm cách nào để tạo một URLđối tượng mới bằng cách sử dụng tệp cục bộ, cho mục đích kiểm tra đơn vị?

Câu trả lời:


283
new File(path).toURI().toURL();

21
Đối với java 7+: Paths.get ("đường dẫn", "đến", "nội dung"). ToUri (). ToURL ()
Ajax

45

Sử dụng Java 7:

Paths.get(string).toUri().toURL();

Tuy nhiên, bạn có thể muốn có được một URI. Ví dụ: URIbắt đầu bằng file:///nhưng một URL có file:/(ít nhất, đó là những gì toStringtạo ra).


"... một URI bắt đầu bằng tệp: /// nhưng một URL có tệp: / ..." Đó có phải là trường hợp của cả Windows và Linux không?
ptntialunrlsd

@ptntialunrlsd Đó là một câu hỏi hay. Tôi chưa kiểm tra, nhưng tôi đoán là có.
Alexanderr Dubinsky

6
Không. URL chỉ là trường hợp đặc biệt của URI. Một URI tệp bắt đầu bằng "file: //" và sau đó liệt kê máy chủ (thường bị bỏ qua), theo sau là "/" và đường dẫn "foo / bar" (thường được đọc là một đường dẫn tuyệt đối). Do đó "tập tin: /// foo / var". Một URI trông giống như "tệp: / foo / bar" là không chính xác. Xem thêm: lược đồ URI tệp
David Tonhofer

@DavidTonhofer Cảm ơn bạn đã giải thích về URI, nhưng điều đó không trả lời câu hỏi của ptntialunrlsd . '... toURL (). ToString ()' tạo ra gì trên Linux? Ngoài ra, tôi đã hoàn nguyên các chỉnh sửa của bạn vì chúng khiến câu trả lời của tôi dài dòng hơn mà không thay đổi ý nghĩa.
Alexanderr Dubinsky

3
@AleksandrDubinsky Tốt nhất là để lại con trỏ vào javadoc của Oracle mặc dù .. dễ dàng hơn để nhấp qua java.nio.file.Paths. Ngoài ra, hãy chắc chắn làm rõ rằng bạn có nghĩa là việc triển khai trong "URI vs URL". Anway java.net.URL.toString()sản xuất điều tương tự trên Unix, như nó phải. Nó chỉ hiển thị một "/" rất sai (xem sơ đồ URI tệp ). Tôi đoán đây là trong Java vì lý do, sử dụng tốt hơn java.net.URI. Nó tạo chính xác "file: // [host] /" trong một cuộc gọi đến .toString().
David Tonhofer


21
new URL("file:///your/file/here")

1
trong đó /your/file/heremột đường dẫn tuyệt đối đến một tệp trên Unix / Linux. Trên Windows, nó sẽ khác.
Robin Green

5
Điều đó không thông minh lắm, vì bạn phải tự xử lý việc thoát các ký tự không được phép trong URL. Trên Windows (và có khả năng là các hệ điều hành khác), bạn cũng phải sửa đổi dấu phân cách đường dẫn từ đường dẫn gốc đến tệp.
jarnbjo

new URL("file:my.properties");
weberjn

Trong khi điều này là chính xác, nó không phải là di động vì nó phụ thuộc vào đường dẫn tuyệt đối.
mazunki


5

hãy xem cú pháp đầy đủ ở đây: http://en.wikipedia.org/wiki/File_URI_scheme cho các hệ thống giống như nó sẽ giống như @Alex đã nói file:///your/file/heretrong khi đối với các hệ thống Windows sẽ làfile:///c|/path/to/file


7
Đừng làm điều đó bằng tay. File.toURI().toURL()là con đường để đi
Sean Patrick Floyd

3
@SeanPatrickFloyd đôi khi bạn không có lựa chọn nào khác, như khi nó ở trong một .propertiestệp.
Sled

@ArtB Tôi không thấy điều đó tạo ra sự khác biệt
Sean Patrick Floyd

2
@SeanPatrickFloyd, câu hỏi này / câu trả lời sẽ xuất hiện khi bạn tìm kiếm java file url, mà trong trường hợp phương tiện của tôi mà tôi đang tìm kiếm những dạng của một file://URL, trong Java, để sử dụng trong một .propertiestập tin, hoặc phải nhập bằng tay vv
daveloyall

1
@SeanPatrickFloyd đôi khi bạn không có quyền truy cập vào mã nguồn, chỉ vào tài sản và file://không may là cần thiết. Bị phụ thuộc hệ thống không phải là một vấn đề lớn vì đây là một tài sản có thể thay đổi.
vikingsteve

4

Bạn cũng có thể dùng

[AnyClass].class.getResource(filePath)

2
nhưng chỉ khi tệp đó tồn tại trong đường dẫn lớp
aepurniet

1
Nếu "filePath" có thể được tìm thấy trong một cái bình, thì URL kết quả sẽ như thế jar:file:/home/user/a/b/c/foo.jar!/com/example/stuff/config.txt.
David Tonhofer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.