Java: как получить файл с экранированного URL? - PullRequest
45 голосов
/ 30 января 2010

Я получаю URL, который находит локальный файл (тот факт, что я получаю URL, не находится под моим контролем). URL корректно экранирован, как определено в RFC2396. Как я могу преобразовать это в объект Java File?

Как ни странно, метод URL getFile () возвращает строку, а не файл.

Я создал каталог с именем "/ tmp / some dir" (с пробелом между "some" и "dir"), который правильно расположен по следующему URL: "file: /// tmp / some % 20dir "(цитаты добавлены для ясности).

Как я могу преобразовать этот URL в файл Java?

Чтобы получить более подробную информацию о моей проблеме, напечатайте следующее false:

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

Хотя следующее (замена «% 20» пробелом вручную) выводит значение true:

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

Обратите внимание, что я не спрашиваю , почему в первом примере выводится false, ни , почему , во втором примере, используя мои хаки replaceAll , печатает true, я спрашиваю как преобразовать экранированный URL в объект Java-файла.

РЕДАКТИРОВАТЬ : спасибо всем, это было почти обманом, но не совсем

Тупо я искал вспомогательный метод внутри самого класса URL.

Следующее работает, как и ожидалось, для получения Java-файла из URL-адреса Java:

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

Ответы [ 3 ]

66 голосов
/ 30 января 2010

Конструктор File, принимающий URI в сочетании с URL#toURI(), должен работать:

URL url = getItSomehow();
File file = new File(url.toURI());
20 голосов
/ 30 января 2010
URLDecoder.decode(url);//deprecated
URLDecoder.decode(url, "UTF-8"); //use this instead

См. Связанный вопрос Как удалить URL в Java?

5 голосов
/ 03 апреля 2015

AFAIK как этот Paths.get(url.toURI()).toFile() лучше всего, начиная с Java 7. См. Также Преобразование файла Java: // путь URL в файл (...), независимый от платформы, включая пути UNC .

...