Текущая рекомендация (с JDK 1.7+) - конвертировать URL → URI → путь. Таким образом, чтобы преобразовать URL-адрес в файл, вы должны сказать Paths.get(url.toURI()).toFile()
. Если вы еще не можете использовать JDK 1.7, я бы порекомендовал new File(URI.getSchemeSpecificPart())
.
Преобразование файла → URI. Сначала я покажу вам несколько примеров того, какие URI вы можете получить в Java.
-classpath URLClassLoader File.toURI() Path.toUri()
C:\Program Files file:/C:/Program%20Files/ file:/C:/Program%20Files/ file:///C:/Program%20Files/
C:\main.c++ file:/C:/main.c++ file:/C:/main.c++ file:///C:/main.c++
\\VBOXSVR\Downloads file://VBOXSVR/Downloads/ file:////VBOXSVR/Downloads/ file://VBOXSVR/Downloads/
C:\Résume.txt file:/C:/R%c3%a9sume.txt file:/C:/Résume.txt file:///C:/Résume.txt
\\?\C:\Windows (non-path) file://%3f/C:/Windows/ file:////%3F/C:/Windows/ InvalidPathException
Некоторые наблюдения об этих URI:
- Спецификации URI: RFC 1738: URL , заменен RFC 2396: URI , заменен RFC 3986: URI . (WHATWG также имеет спецификацию URI , но она не определяет, как следует интерпретировать файловые URI.) Любые зарезервированные символы в пути указываются в процентах, а символы не ascii в URI - в процентах цитируется при вызове URI.toASCIIString ().
- File.toURI () хуже, чем Path.toUri (), потому что File.toURI () возвращает необычный не RFC 1738 URI (дает файл: / вместо file: ///) и не форматирует URI для путей UNC в соответствии с предпочтительным форматом Microsoft . Однако ни один из этих URI UNC не работает в Firefox (для Firefox требуется файл: /////).
- Путь более строг, чем Файл; вы не можете создать неверный путь из префикса «\. \» . «Эти префиксы не используются как часть самого пути», но они могут быть переданы в Win32 API.
Преобразование URI → файл: попробуем преобразовать предыдущие примеры в файлы:
new File(URI) Paths.get(URI) new File(URI.getSchemeSpecificPart())
file:///C:/Program%20Files C:\Program Files C:\Program Files C:\Program Files
file:/C:/Program%20Files C:\Program Files C:\Program Files C:\Program Files
file:///C:/main.c++ C:\main.c++ C:\main.c++ C:\main.c++
file://VBOXSVR/Downloads/ IllegalArgumentException \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file:////VBOXSVR/Downloads/ \\VBOXSVR\Downloads \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file://///VBOXSVR/Downloads \\VBOXSVR\Downloads \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file://%3f/C:/Windows/ IllegalArgumentException IllegalArgumentException \\?\C:\Windows
file:////%3F/C:/Windows/ \\?\C:\Windows InvalidPathException \\?\C:\Windows
Опять же, использование Paths.get(URI)
предпочтительнее, чем new File(URI)
, поскольку Path может обрабатывать UNC URI и отклонять неверные пути с префиксом \? \. Но если вы не можете использовать Java 1.7, скажите new File(URI.getSchemeSpecificPart())
.
Кстати, не используйте URLDecoder
для декодирования URL файла. Для файлов, содержащих «+», таких как «file: /// C: /main.c++», URLDecoder
превратит его в «C: \ main.c»! URLDecoder
предназначен только для синтаксического анализа представлений HTML-форм application / x-www-form-urlencoded в запросе URI (param=value¶m=value
), но не для удаления пути из URI без кавычек.
2014-09: отредактировано для добавления примеров.