Przekaż plik lokalny do adresu URL w Javie

175

Jak utworzyć nowy URLobiekt przy użyciu pliku lokalnego na potrzeby testów jednostkowych?

Tymczasem InHell
źródło

Odpowiedzi:

283
new File(path).toURI().toURL();
jarnbjo
źródło
22
Dla java 7+: Paths.get ("ścieżka", "do", "rzeczy"). ToUri (). ToURL ()
Ajax
46

Korzystanie z języka Java 7:

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

Jednak prawdopodobnie chcesz uzyskać URI. Np. A URIzaczyna się od, file:///ale adres URL od file:/(przynajmniej to toStringtworzy).

Aleksandr Dubinsky
źródło
„... identyfikator URI zaczyna się od file: ///, ale adres URL zawiera plik: / ...” Czy tak jest w przypadku systemów Windows i Linux?
ptntialunrlsd
@ptntialunrlsd To dobre pytanie. Nie sprawdzałem, ale myślę, że tak.
Aleksandr Dubinsky
7
Nie. Adres URL to tylko specjalny przypadek identyfikatora URI. Identyfikator URI pliku zaczyna się od „file: //”, a następnie zawiera nazwę hosta (zwykle pomijany), po którym następuje „/” i ścieżka „foo / bar” (ogólnie rozumiana jako ścieżka bezwzględna). Stąd „file: /// foo / var”. Identyfikator URI, który wygląda jak „plik: / foo / bar” jest nieprawidłowy. Zobacz także: schemat URI pliku
David Tonhofer
@DavidTonhofer Dziękuję za wyjaśnienie identyfikatorów URI, ale to nie odpowiada na pytanie ptntialunrlsd . Co „... toURL (). ToString ()” produkuje w systemie Linux? Poza tym cofnęłam Twoje zmiany, ponieważ uczyniły moją odpowiedź bardziej rozwlekłą bez zmiany znaczenia.
Aleksandr Dubinsky,
3
@AleksandrDubinsky Najlepiej jednak pozostawić wskaźniki do Oracle javadoc w… łatwiej jest kliknąć java.nio.file.Paths. Upewnij się również, że masz na myśli implementacje w „URI a URL”. Anway java.net.URL.toString()produkuje to samo na Uniksie, jak musi. Wyświetla tylko jeden znak „/”, który jest bardzo zły (patrz schemat URI pliku ). Myślę, że to jest w Javie z powodów, lepszego wykorzystania java.net.URI. Prawidłowo generuje „file: // [host] /” w wywołaniu .toString().
David Tonhofer,
40
new File("path_to_file").toURI().toURL();
Ted Hopp
źródło
21
new URL("file:///your/file/here")
Alex
źródło
1
gdzie /your/file/herejest bezwzględną ścieżką do pliku w systemie Unix / Linux. Myślę, że w systemie Windows byłoby inaczej.
Robin Green
5
Nie jest to zbyt sprytne, ponieważ sam musisz poradzić sobie z ucieczką znaków, które nie są dozwolone w adresach URL. W systemie Windows (i potencjalnie w innych systemach operacyjnych) należy również zmodyfikować separator ścieżki z natywnej ścieżki do pliku.
jarnbjo
new URL("file:my.properties");
weberjn
Chociaż jest to poprawne, nie jest przenośne, ponieważ zależy od ścieżek bezwzględnych.
mazunki
10
File myFile=new File("/tmp/myfile");
URL myUrl = myFile.toURI().toURL();
Sean Patrick Floyd
źródło
5

spójrz tutaj na pełną składnię: http://en.wikipedia.org/wiki/File_URI_scheme dla systemów typu unix będzie tak, jak powiedział @Alex, file:///your/file/herepodczas gdy dla systemów Windowsfile:///c|/path/to/file

Liv
źródło
7
Nie rób tego ręcznie. File.toURI().toURL()jest droga
Sean Patrick Floyd
3
@SeanPatrickFloyd czasami nie masz wyboru, na przykład gdy jest w .propertiespliku.
Sanki
@ArtB Nie wiem, jak to robi różnicę
Sean Patrick Floyd
2
@SeanPatrickFloyd, to pytanie / odpowiedź pojawia się podczas wyszukiwania java file url, co w moim przypadku oznacza, że ​​szukałem formatu file://adresu URL, w Javie, do wykorzystania w .propertiespliku lub do
wpisania
1
@SeanPatrickFloyd czasami nie masz dostępu do kodu źródłowego, tylko do właściwości i file://jest to niestety konieczne. Bycie zależnym od systemu nie jest tak dużym problemem, ponieważ jest to zmienna właściwość.
vikingsteve
4

Możesz także użyć

[AnyClass].class.getResource(filePath)
xMichal
źródło
2
ale tylko wtedy, gdy ten plik istnieje w ścieżce klas
aepurniet
1
Jeśli „filePath” można znaleźć w słoiku, wynikowy adres URL będzie wyglądał jak jar:file:/home/user/a/b/c/foo.jar!/com/example/stuff/config.txt.
David Tonhofer