Передать локальный файл в URL в Java

175

Как мне создать новый URLобъект, используя локальный файл, для целей юнит-тестов?

MeanwhileInHell
источник

Ответы:

283
new File(path).toURI().toURL();
jarnbjo
источник
22
Для Java 7+: Paths.get ("путь", "к", "материал"). ToUri (). ToURL ()
Ajax
46

Используя Java 7:

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

Тем не менее, вы, вероятно, хотите получить URI. Например, a URIначинается с file:///URL-адреса file:/(по крайней мере, это то, что toStringпроизводит).

Александр Дубинский
источник
«... URI начинается с file: ///, а URL с file: / ...». Это как для Windows, так и для Linux?
ptntialunrlsd
@ptntialunrlsd Это хороший вопрос. Я не проверял, но я бы предположил, да.
Александр Дубинский
7
Нет. URL - это особый случай URI. URI файла начинается с «file: //», а затем перечисляет хост (как правило, опускается), за которым следуют «/» и путь «foo / bar» (обычно подразумеваемый как абсолютный путь). Таким образом "file: /// foo / var". URI, который выглядит как «file: / foo / bar», неверен. Смотрите также: файл URI схемы
Дэвид Тонхофер
@DavidTonhofer Спасибо за объяснение URI, но это не отвечает на вопрос ptntialunrlsd . Что '... toURL (). ToString ()' производит в Linux? Кроме того, я отменил ваши правки, потому что они сделали мой ответ более многословным, не меняя смысла.
Александр Дубинский
3
@AleksandrDubinsky Лучше всего оставить указатели на Javadoc для Oracle, хотя ... проще переходить по ним java.nio.file.Paths. Кроме того, убедитесь, что вы имеете в виду реализации в «URI против URL». Anway java.net.URL.toString()производит то же самое в Unix, как и должно. Он отображает только одну "/", что очень неправильно (см. Схему URI файла ). Я думаю, что это на Java по причинам, лучше использовать java.net.URI. Он правильно генерирует «file: // [host] /» при вызове .toString().
Дэвид Тонхофер
21
new URL("file:///your/file/here")
Alex
источник
1
где /your/file/hereабсолютный путь к файлу в Unix / Linux. На Windows это было бы иначе, я думаю.
Робин Грин
5
Это не очень умно, так как вам приходится самостоятельно обрабатывать экранирование символов, которые не допускаются в URL. В Windows (и, возможно, в других операционных системах) вы также должны изменить разделитель пути от собственного пути к файлу.
jarnbjo
new URL("file:my.properties");
Weberjn
Хотя это правильно, оно не переносимо, поскольку зависит от абсолютных путей.
мазунки
10
File myFile=new File("/tmp/myfile");
URL myUrl = myFile.toURI().toURL();
Шон Патрик Флойд
источник
5

посмотрите здесь полный синтаксис: http://en.wikipedia.org/wiki/File_URI_scheme для unix-подобных систем, как будет сказано @Alex, file:///your/file/hereтогда как для систем Windowsfile:///c|/path/to/file

Liv
источник
7
Не делай этого вручную. File.toURI().toURL()путь
Шон Патрик Флойд
3
@SeanPatrickFloyd иногда у вас нет выбора, например, когда он находится в .propertiesфайле.
Сани
@ArtB Я не вижу, как это меняет дело
Шон Патрик Флойд
2
@SeanPatrickFloyd, этот вопрос / ответ возникает при поиске java file url, что в моем случае означает, что я искал формат file://URL, в Java, для использования в .propertiesфайле или для ввода вручную и т. Д.
daveloyall
1
@SeanPatrickFloyd иногда у вас нет доступа к исходному коду, только к свойству, и file://, к сожалению, это необходимо. Быть зависимым от системы - не такая большая проблема, так как это изменчивое свойство.
Викингстеве
4

Вы также можете использовать

[AnyClass].class.getResource(filePath)
xMichal
источник
2
но только если этот файл существует в classpath
aepurniet
1
Если «filePath» может быть найден в банке, результирующий URL-адрес выглядит так jar:file:/home/user/a/b/c/foo.jar!/com/example/stuff/config.txt.
Дэвид Тонхофер