Как исправить javax.imageio.IIOException: невозможно прочитать входной файл в Linux

Я разрабатываю небольшое приложение с графическим интерфейсом и хочу загрузить свои изображения из папки ресурсов. Это работает в 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: не удается прочитать входной файл, потому что принятый ответ не работает в моем случае, а синтаксис полностью отличается от принятого ответа на мой вопрос. Также редактирование не ясно показывает, как адаптировать решение.

Просто предположение, что это возможно, потому что он не может найти ваше изображение. Вы должны использовать getClass().getResource("/images/yourImageName.extension");.

Dushyant Tankariya 15.07.2019 13:01

Я очень сомневаюсь в этом, потому что он может найти изображения в Windows 10 Pro x64. Конечно, я попробую, если есть какая-то разница в том, чтобы сделать это с подпапкой, но я не думаю, что будет какая-то разница.

Marvin 15.07.2019 13:06

Как и ожидалось, это то же сообщение об ошибке с bI = ImageIO.read(new File(getClass().getClassLoader().getResource("images/black.j‌​pg").getFile()));

Marvin 15.07.2019 13:15

Как это возможно, что вы получили ту же ошибку getClass().getClassLoader().getResource("images/black.jpg").‌​getFile()) для getClass().getResource("images/black.jpg"). Можете ли вы обновить свой вопрос со структурой вашего проекта!

Dushyant Tankariya 15.07.2019 13:17

Возможный дубликат imageio.IIOException: не удается прочитать входной файл

Dushyant Tankariya 15.07.2019 13:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
659
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не используйте метод getFile() URL. Это не возвращает действительное имя файла. На самом деле он возвращает часть пути URL-адреса со всеми неповрежденными процентными экранами. Он называется getFile, потому что класс URL-адресов был частью Java 1.0, выпущенной в середине 90-х годов, когда почти все URL-адреса ссылались на физические файлы либо на том же, либо на другом компьютере.

К счастью, вам это не нужно. Вы можете просто использовать метод чтения ImageIO, который принимает URL-адрес:

bI = ImageIO.read(getClass().getResource("/images/black.jpg"));

Важным преимуществом обращения с ресурсами как с URL-адресами, а не как с файлами, является то, что ваш код будет работать, когда вы упаковываете свою программу в файл .jar.

Другие вопросы по теме