Не удается прочитать входной файл — Чтение изображения, содержащегося в файле jar — java

#java #image #swing #exception #executable-jar

#java #изображение #swing #исключение #исполняемый файл-jar

Вопрос:

Я предполагаю, что подобный вопрос был задан, но я не смог найти решение. Я просто работаю над приложением для рисования, основанным на Java Swings. Мне нужно создать экземпляр для класса BufferedImage, чтобы сохранить изображение, которое я нарисовал. Я хотел бы выбрать фоновое изображение, поверх которого я бы что-нибудь нарисовал. У меня есть некоторый предопределенный набор фоновых изображений, которые я поместил в ту же папку, что и исходный файл, и получаю к ним доступ в коде. Код работает отлично, когда он выполняется в Netbeans. Если я создаю и запускаю файл jar, он сообщает, что не удается прочитать входной файл. Я узнал, что мы не можем получить доступ к файлу в jar напрямую, и поэтому я использовал следующий код :

 InputStream is = this.getClass().getClassLoader().getResourceAsStream("bg3.jpg");
bgfile=ImageIO.read(is);
  

bgfile является объектом класса BufferedImage. Итак, как только я запускаюсь как файл jar, возникает следующее исключение IOException :

Не удается прочитать входной файл!

Но если я открою файл jar с помощью winrar, я смогу найти файл bg3.jpg в корне файла jar. Если я укажу путь как «/bg3.jpg «, сам файл jar не открывается.

Итак, мне нужна некоторая помощь и пояснения по этому поводу. Заранее спасибо.

Ответ №1:

Содержимое файла jar чувствительно к регистру. Это может показаться глупым, но вы проверили регистр файла? Если у вас есть файл File.jpg , затем загрузка file.jpg не будет работать. Даже расширения чувствительны к регистру (file.JPG против file.jpg ).

Ответ №2:

Поскольку ваше решение такое же, как описано здесь, я думаю, вы просто забываете включить пакет в path, т.Е.:

 InputStream is = this.getClass().getClassLoader().getResourceAsStream("package1/package2/.../bg3.jpg");
bgfile=ImageIO.read(is);
  

Ответ №3:

Вероятно, была бы полезна полная трассировка стека. Однако, если ваше описание исключения точное, это не означает, что вы не можете найти файл изображения. Он сообщает вам, что не может его прочитать. Вы уверены, что файл jpg не поврежден или по какой-либо другой причине не распознается как jpg для класса ImageIO?

Метод ImageIO.read() выдает исключение с причиной ввода == null, если ресурс равен null. Я думаю, что он его находит. Он просто не может прочитать его как файл jpg (хотя трудно быть уверенным без полной трассировки стека).

Если ваш ресурс изображения действительно находится на верхнем уровне файла jar, то вам не нужен какой-либо начальный разделитель файлов. Итак, если ваш jar выглядит следующим образом:

 1523 Tue Mar 30 23:14:50 CDT 2010 org/apache/log4j/xml/SAXErrorHandler.class<br>
286 Tue Mar 30 23:14:50 CDT 2010  org/apache/log4j/xml/UnrecognizedElementHandler.class<br>
4109 Tue Mar 30 23:14:52 CDT 2010 org/apache/log4j/xml/XMLLayout.class<br>
 745 Tue Mar 30 23:14:52 CDT 2010 org/apache/log4j/xml/XMLWatchdog.class<br>
7028 Tue Mar 30 23:14:34 CDT 2010 org/apache/log4j/xml/log4j.dtd<br>
 911 Wed May 11 14:31:30 CDT 2011 redball.gif
  

Вы бы загрузили redball.gif с:

 Image image = (ImageIO.read(this.getClass().getClassLoader().getResource("redball.gif")));