2016-03-23 3 views
0

В приведенном ниже примере кода, когда я тестирую код в Eclipse, он работает нормально. Тем не менее, когда я экспортировать файл банку и проверить его через командную строку, он выдает ошибку: IIOException: Can't read input file!Экспортированный файл Jar не будет читать файл внутри jar

private BufferedImage img = null; 
private String imgSource; 

if (img == null) 
{ 
    try { 
     URL url = getClass().getResource("Images/questionMark.png"); 
     System.out.println(url.getPath()); 
     /* This prints: file:/C:/Users/Keno/Documents/javaFile.jar!/javaFile/Images/questionMark.png */ 
     File file = new File(url.getPath()); 
     img = ImageIO.read(file); 
     imgSource = file.getName(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Файл Я хочу, чтобы находится в папке изображения, которая находится внутри javaFile пакета. Я заметил одну вещь, которая может указывать на проблему.

  1. В заявлении на печать у меня есть знак восклицательного знака в конце раздела javaFile.jar. Это верно? Может ли это указать на проблему с файлом или структурой?

Кроме того, только в случае, если кто-то есть лучшее предложение о том, как я должен загрузить файл, я расскажу вам о своих намерениях. Я хотел бы загрузить файл из относительного местоположения (папка «Изображения») в банке. Я хотел бы отобразить его (уже сделано в моем фактическом коде), а также сохранить местоположение, которое будет передано позже, на другую функцию (также сделанное).

+3

попробовать с GetClass(). GetResourceAsStream –

+0

@ oliv37 Это означало бы, что я должен включить URL в InputStream. Должен ли я затем преобразовать его в файл? –

+0

ImageIO.read (inputStream) –

ответ

1

попробовать этот

public void test() { 
    try(InputStream is = getClass().getResourceAsStream("Images/questionMark.png")) { 
     ImageIO.read(is); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Итак, это сработало, но мое единственное беспокойство заключается в том, что использование InputStream было немного медленнее, чем чтение из файла. Есть ли способ ускорить это или что-то еще? –

+0

Я не думаю, что это медленнее, чем вызов метода чтения с аргументом файла. Если вы посмотрите на исходный код метода чтения -> http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/javax/imageio/ImageIO.java#ImageIO .read% 28java.io.File% 29 вы увидите, что он создает inputStream. –

+0

О, возможно, что-то еще в моем коде, похоже, замедляет его. Теперь я знаю, в чем проблема. Еще раз спасибо! –

0

Вы должны попытаться проверить, находится ли ваш класс в той же директории, что и изображения внутри вашей банки.

| 
    |- Your class 
    |- Images 
     |- questionMark.png 

Кроме того, вы пытались напрямую использовать свой объект url?

File file = new File(url); 
+0

Вы не можете сделать файл с объекта url. –

+0

Моя ошибка, я имел в виду URI, а не URL – Webster

Смежные вопросы