Создать URL для файла - PullRequest
9 голосов
/ 07 мая 2010

Выход по умолчанию File.toURL() равен

file:/c:/foo/bar

Похоже, что они не работают на окнах, и должны быть изменены на

file:///c:/foo/bar

Имеет ли формат

file:/foo/bar

правильно работает в Unix (у меня нет машины Unix для тестирования)? Существует ли библиотека, которая может позаботиться о создании URL-адреса из файла в правильном формате для текущей среды?

Я решил использовать регулярное выражение для решения проблемы, например:

fileUrl.replaceFirst("^file:/", "file:///")

Однако, это не совсем правильно, потому что он преобразует правильный URL, например:

file:///c:/foo/bar

до:

file://///c:/foo/bar

Обновление

Я использую Java 1.4, и в этой версии File.toURL() не устарела, и File.toURL().toString() и File.toURI().toString() генерируют одинаковый (неправильный) URL-адрес в Windows

Ответы [ 3 ]

12 голосов
/ 07 мая 2010

File(String) ожидает путь, а не URL. Если вы хотите создать File на основе String, который фактически представляет URL, то вам сначала нужно преобразовать String обратно в URL и использовать File(URI)* 1010. * для построения File на основе URL#toURI().

String urlAsString = "file:/c:/foo/bar";
URL url = new URL(urlAsString);
File file = new File(url.toURI());

Обновление: , поскольку вы работаете на Java 1.4, а URL#toURI() на самом деле является методом Java 1.5 (извините, пропустил этот бит), лучше использовать URL#getPath() вместо которого возвращается путь, чтобы вы могли использовать File(String).

String urlAsString = "file:/c:/foo/bar";
URL url = new URL(urlAsString);
File file = new File(url.getPath());
5 голосов
/ 07 мая 2010

Метод File.toURL () устарел - рекомендуется вместо этого использовать метод toURI (). Если вы используете это вместо этого, ваша проблема исчезнет?


Edit:

Я понимаю: вы используете Java 4. Однако ваш вопрос не объяснил, что вы пытались сделать. Если, как вы указали в комментариях, вы пытаетесь просто прочитать файл, используйте для этого FileReader (или FileInputStream , если файл представляет собой двоичный формат).

1 голос
/ 07 мая 2010

Что вы на самом деле имеете в виду под «Правильно ли работает формат file:/c:/foo/bar в Unix»?

Некоторые примеры из Unix.

File file = new File("/tmp/foo.txt"); // this file exists
System.out.println(file.toURI()); // "file:/tmp/foo.txt"

Однако вы не можете, например, сделать это:

File file = new File("file:/tmp/foo.txt");
System.out.println(file.exists()); // false

(Если вам нужен экземпляр URL, сделайте file.toURI().toURL(), как Javadoc говорит .)

Редактировать : как насчет следующего, это поможет?

URL url = new URL("file:/tmp/foo.txt");
System.out.println(url.getFile());  // "/tmp/foo.txt"
File file = new File(url.getFile());
System.out.println(file.exists());  // true

(в основном очень близко к примеру BalusC, в котором использовалось new File(url.toURI()).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...