При построении строки из 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:/, добавленного к строке?
Я подумал, что, возможно, путь лежит к файлу, но я ошибся, даже таргетинг на папки дает такой результат.
2 ответов:
Это URL-путь, специфичный для файлов. Вроде как веб-адреса имеют http://, https: / / или ftp:// URL для файла сохраняет этот синтаксис, таким образом, file:/ родился .
Например, скопируйте изображение, подобное тесту.jpg на ваш диск C.
Чем открыть браузер и набрать: файл:/c: / test.jpg
Нажмите введите , и изображение должно быть загружено.
В чем преимущество файла: / который добавляется к струна?
Никаких реальных преимуществ, кроме того, что он становится допустимым URL, он может использоваться только как URL, а не как допустимый путь к файлу, для этого вы бы опустили файл: / как вы видели
Смотрите файловую схему URI подробнее
Метод
Class.getResources(String)возвращает aURL. Это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