#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 предназначен для материалов, которые вы развертываете в своем приложении.