Почему мой BufferedImage получает нулевое значение из ImageIO.read()

#java #bufferedimage

#java #bufferedimage

Вопрос:

 BufferedImage = ImageIO.read(getClass().getResourceAsStream("/Images/player.gif"));
  

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

Для этого я получаю сообщение об ошибке java.lang.IllegalArgumentException: input == null!

Я не понимаю, почему приведенный выше код не работает. Из всего, что я прочитал, я не понимаю, почему это не так. Мне сказали, что я должен использовать FileInputStream вместо GetResourceAsStream , но, как я только что сказал, я не понимаю, почему. Я прочитал документацию по методам и различным руководствам, и кажется, что это сработает.

Редактировать: Хорошо, пытаюсь прояснить некоторые вещи в отношении того, что у меня есть в пути к классу.

Это проект, созданный в Eclipse. Все находится в папке проекта DreamGame , включая папку «Images». DreamGame это, конечно, в пути к классу. Я знаю, что это работает, потому что я читаю текстовый файл /Images с информацией о gif ранее в коде.

Итак, у меня есть: /DreamGame/Images/player.gif

Редактировать 2: строка, которая в настоящее время находится в исходном сообщении, — это все, что передается; нет /DreamGame/Images/player.gif , просто /Images/player.gif . Это из метода в классе ImagesLoader , который вызывается при создании объекта из PlayerSprite . Основной класс DreamGame . Я запускаю код прямо из Eclipse, используя Run опцию без специальных параметров

Пытаюсь выяснить, как определить, какой загрузчик классов загружает класс. Извините, по сравнению с большинством людей, я в этом новичок.

Хорошо, это то, что getClassLoader() меня заводит: sun.misc.Launcher$AppClassLoader@4ba778

getClass().getResource(getClass().getName() ".class") ВОЗВРАТ /home/gixugif/Documents/projects/DreamGame/bin/ImagesLoader.class

Файл изображения bin также помещается. Для двойной проверки я удалил файл bin , очистил проект и запустил его. По-прежнему возникает та же проблема, и файл изображения возвращается в bin

Комментарии:

1. Уверен, что этот путь не является абсолютным путем в файловой системе, а не из пути к классу?

Ответ №1:

В принципе, Class.getResourceAsStream не делает того, что вы думаете.

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

Похоже, у вас, вполне возможно, действительно должно быть что-то вроде:

 BufferedImage = ImageIO.read(getClass().getResourceAsStream("/Images/player.gif"))
  

(РЕДАКТИРОВАТЬ: показанный исходный код отличался и имел полный путь к файловой системе.)

и вы убедитесь, что изображения скопированы в подходящее место, чтобы загрузчик классов текущего класса мог выбрать Images каталог. Когда вы упаковываете его в jar-файл, вам тоже нужен Images каталог.

РЕДАКТИРОВАТЬ: этот бит может быть проблемой:

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

Папка images не должна находиться в пути к классу — должен быть родительский элемент папки Images, чтобы затем, когда загрузчик классов ищет Images каталог, он находил его в своем корне.

Комментарии:

1. Приятно знать, спасибо, но это ничего не исправляет. На самом деле у меня все равно есть getResourceAsStream(IMAGE_DIR fnm) в моем реальном коде. Просто подумал, что я должен указать, что это решает, как здесь. Отредактировал исходное сообщение, чтобы показать это.

2. @user1022004: Ну, это исправит это, если загрузчик классов настроен соответствующим образом с файлами в соответствующем месте. Мы понятия не имеем, как вы это запускаете, какой загрузчик классов вы используете и т.д. Обратите внимание, что сама папка Images не должна находиться в пути к классу — должна быть родительская папка.

3. Хорошо, извините за путаницу. Я снова отредактировал, чтобы прояснить ситуацию. Если есть какие-либо проблемы, связанные с путем к классу, теперь вы можете быть уверены, что они существуют, и это не от того, что я не понимаю.

4. @Gixugif: ваша последняя строка все еще не ясна — вы передаете «/DreamGame/Images/player.gif «куда угодно? Как развертываются ваши классы? Как вы запускаете свой код?

5. Строка, которая в настоящее время находится в исходном сообщении, — это все, что передается; нет «/DreamGame/Images/player.gif «, просто «/Images/player.gif «. Это из метода класса «ImagesLoader», который вызывается при создании объекта из «playerSprite». Основной класс — DreamGame . Я запускаю код прямо из Eclipse, используя опцию «Выполнить».

Ответ №2:

Если вы используете resourceAsStream, «/» ссылается на корень записи classpath, а не на корень файловой системы. возможно, причина в том, что вы смотрите на путь, который вы используете.

Если вы загружаете что-то с какого-то домашнего пути, вам, вероятно, следует использовать FileInputStream . getResourceAsStream предназначен для материалов, которые вы развертываете в своем приложении.