При построении строки из getResource ("...") вывод начинается с "file:/"?



Давайте рассмотрим image.png, хранящийся внутри одного из пакетов проекта с именем icons , я обычно получаю значки с помощью метода getResource():



String imgPath = getClass().getResource("/icons/image.png").toString();
//no problem with creating an ImageIcon with this path
Image img = new ImageIcon(imgPath).getImage();
//but the problem occures when trying to open this image through Desktop
//try-catch
Desktop.getDesktop().open(imagePath);
//or
File imgFile = new File(imgPath);
//error, this file does not exist!


Я заметил, что построение строки из URL дает вывод, который начинается с file:/...., это не создает проблем с загрузкой изображения, но открытие файла невозможно до удаления file:/.



Какова выгода от file:/, добавленного к строке?


Я подумал, что, возможно, путь лежит к файлу, но я ошибся, даже таргетинг на папки дает такой результат.

722   2  

2 ответов:

Это URL-путь, специфичный для файлов. Вроде как веб-адреса имеют http://, https: / / или ftp:// URL для файла сохраняет этот синтаксис, таким образом, file:/ родился .

Например, скопируйте изображение, подобное тесту.jpg на ваш диск C.

Чем открыть браузер и набрать: файл:/c: / test.jpg

Нажмите введите , и изображение должно быть загружено.

В чем преимущество файла: / который добавляется к струна?

Никаких реальных преимуществ, кроме того, что он становится допустимым URL, он может использоваться только как URL, а не как допустимый путь к файлу, для этого вы бы опустили файл: / как вы видели

Смотрите файловую схему URI подробнее

Метод Class.getResources(String) возвращает a URL. Это URL может быть локальным файлом, и в этом случае он будет начинаться с Протокола file:/. Однако приложение или этот класс могут выполняться из файла JAR, а ресурс может содержаться в файле JAR. Sun создала протокол jar:/ для этих случаев. Тогда URL может быть задано как jar:file:/myapp.jar!/com/azad/images/image.png. Поэтому вместо использования методов, основанных на файлах, используйте методы, основанные на URL:

URL imgURL = getClass().getResource("/icons/image.png");
//no problem with creating an ImageIcon with this URL
Image img = new ImageIcon(imgURL).getImage();

ImageIcon имеет конструктор , который принимает URL. Смотреть на классJarURLConnection тоже. Вы не можете зависеть от Desktop, чтобы открыть Ваш URL для вас; этот класс обрабатывает только файлы. Если Ваш URL-адрес не указывает на обычный файл, вы не можете удалить file:/ из строки.

Я редактировал ваш пост: вы использовали img дважды.

Comments

    Ничего не найдено.