Я работал над проектом на Java с использованием Eclipse, который требует загрузки некоторых изображений и их отображения.Сначала я загрузил их следующим образом:
InputStream stream = MyClass.class.getClass().getResourceAsStream("/resources/ui/icons/" + name);
Image img = ImageIO.read(stream).getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);
И это работало нормально, независимо от того, запускаю ли я его из Eclipse или из исполняемого файла jar.Но недавно я получил новый ноутбук, и когда я попытался запустить его на новом компьютере, банка не работала;stream
всегда оказывается null
.Однако эта проблема не возникает, когда я работаю из Eclipse.
Наконец, после некоторых экспериментов, я изменил код так, чтобы он вызывал getResourceAsStream()
непосредственно на MyClass.class
без вызова getClass()
:
InputStream stream = MyClass.class.getResourceAsStream("/resources/ui/icons/" + name);
Image img = ImageIO.read(stream).getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);
И по какой-то причине это работает.У моего нового ноутбука та же ОС (Windows 10) и другие настройки, что и у старого, но вместо Oxygen работает Eclipse Photon.
Итак, в чем разница между двумя способами загрузки ресурсов?(Я слышал, что это что-то про ClassLoaders, но я не могу вспомнить точные слова.) Почему переключение на новую машину сломало первую?И даже со вторым я делаю это правильно?