Я разрабатываю небольшое приложение с графическим интерфейсом и хочу загрузить свои изображения из папки ресурсов. Это работает в Windows, но в Linux (Ubuntu 19.04 и Raspbian Buster) — нет.
Я пытался переключиться с
getClass().getResource("black.jpg").getFile()
к
getClass().getClassLoader().getResource("black.jpg").getFile()
Это мой класс просмотра, простирающийся от JFrame (сокращенно)
public View() {
try {
bI = ImageIO.read(new File(getClass().getClassLoader().getResource("black.jpg").getFile()));
} catch (IOException e) {
e.printStackTrace();
}
[...]
contentPane = new BackgroundPanel(bI);
Сообщение об ошибке в терминале:
javax.imageio.IIOException: Can't read input file!
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1308)
at de.grapatin.escaperoom.view.View.<init>(View.java:38)
at de.grapatin.escaperoom.controller.Controller.<init
(Controller.java:11)
at de.grapatin.escaperoom.App.main(App.java:11)
Я ожидаю, что изображение будет показано, но этого не происходит. Фон черный (как и изображение black.jpg в моем коде), но его замена не решает проблему.
Структура проекта:
─src
│ ├───main
│ │ ├───java
│ │ │ └───de
│ │ │ └───marvin
│ │ │ └───uitest
│ │ │ ├───controller
│ │ │ ├───model
│ │ │ │ └───enums
│ │ │ ├───util
│ │ │ └───view
│ │ └───resources
│ │ └───images
Результат
System.out.println(getClass().getResource("/black.jpg").getFile());
является
file:/C:/Users/marvin/uitest/target/uitest-0.0.1-SNAPSHOT.jar!/black.jpg
! не приходит с моей стороны
Я только что обнаружил, что Windows также не читает файл изображения из банки. Но он есть в корне папки.
Этот вопрос не является дубликатом следующего: imageio.IIOException: не удается прочитать входной файл, потому что принятый ответ не работает в моем случае, а синтаксис полностью отличается от принятого ответа на мой вопрос. Также редактирование не ясно показывает, как адаптировать решение.
Я очень сомневаюсь в этом, потому что он может найти изображения в Windows 10 Pro x64. Конечно, я попробую, если есть какая-то разница в том, чтобы сделать это с подпапкой, но я не думаю, что будет какая-то разница.
Как и ожидалось, это то же сообщение об ошибке с bI = ImageIO.read(new File(getClass().getClassLoader().getResource("images/black.jpg").getFile()));
Как это возможно, что вы получили ту же ошибку getClass().getClassLoader().getResource("images/black.jpg").getFile()) для getClass().getResource("images/black.jpg"). Можете ли вы обновить свой вопрос со структурой вашего проекта!
Возможный дубликат imageio.IIOException: не удается прочитать входной файл




Не используйте метод getFile() URL. Это не возвращает действительное имя файла. На самом деле он возвращает часть пути URL-адреса со всеми неповрежденными процентными экранами. Он называется getFile, потому что класс URL-адресов был частью Java 1.0, выпущенной в середине 90-х годов, когда почти все URL-адреса ссылались на физические файлы либо на том же, либо на другом компьютере.
К счастью, вам это не нужно. Вы можете просто использовать метод чтения ImageIO, который принимает URL-адрес:
bI = ImageIO.read(getClass().getResource("/images/black.jpg"));
Важным преимуществом обращения с ресурсами как с URL-адресами, а не как с файлами, является то, что ваш код будет работать, когда вы упаковываете свою программу в файл .jar.
Просто предположение, что это возможно, потому что он не может найти ваше изображение. Вы должны использовать
getClass().getResource("/images/yourImageName.extension");.