2015-02-02 5 views
1

Я сделал функцию (Java), который должен прочитать bytes из файла и распечатать их на консоль:Правильный путь для использования ClassLoader.getResource()?

public void loadPixels(int size){ 
    ClassLoader cl = this.getClass().getClassLoader(); 
    pixels = new byte[size]; 
    try{ 
     InputStream stream = cl.getResource("res/" + fileName).openStream(); 
     stream.read(pixels); 
     System.out.println(pixels.toString()); 
     stream.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

Проблема заключается в том, что я получаю NullPointerException на линии

InputStream stream = cl.getResource("res/" + fileName).openStream(); 

Для файла, который я пытаюсь открыть, имя «font.spt», которое также является значением, хранящимся fileName. Этот файл находится в папке «res» в корневом каталоге проекта, и в настоящее время я использую Eclipse IDE.

Является ли мой подход к пути к файлу неправильным или что-то еще проблема?

Напомним: fileName указывает на «font.spt», который находится под папкой «res» в каталоге bin.

EDIT: папка «res», содержащая файл .spt, теперь находится под «bin» для проекта, а не корневого каталога, но я все еще получаю ошибку. При запуске из среды IDE или экспортированного .jar я все еще получаю NullPointerException, где я должен помещать эти файлы? Может ли кто-нибудь дать мне скриншот или пример?

+0

Вы можете открыть файл .jar с помощью инструмента zipping и найти путь, где находится ваш файл, или у вас есть веб-проект? –

+2

ClassLoader загружает ресурсы из пути к классам. Если файл находится в корне проекта, он не компилируется Eclipse в выходной каталог и, таким образом, не находится в пути к классам во время выполнения. Поместите файл в каталог источников, если вы хотите, чтобы он находился в пути к классам во время выполнения. –

+0

с именем «res /» + filename, означает ли это, что я хочу создать папку под «src» с именем «res», а затем разместить там файлы? – user2649681

ответ

2

По умолчанию Eclipse копирует все файлы, не содержащие .java, которые он находит в исходных местоположениях проекта в выходную папку при ее создании. Таким образом, один из вариантов - просто разместить файлы ресурсов в исходной папке вместе с исходным кодом. Однако лучше использовать отдельную папку resources для файлов, отличных от Java, и объявить это как дополнительное местоположение источника (через объекты проекта Java Build Path). Так организованы проекты Maven и Gradle.

Например, вы могли бы:

MyProject\ 
    src\ 
     java\ 
      com\ 
       ....*.java 
     resources\ 
      fonts\ 
       font.spt 

С обеих src\java\ и src\resources\ определяется как Источник местоположения в Build Path. Тогда ваш код для загрузки файла будет примерно так:

getResource("fonts/" + fileName) 

Что-то рассмотреть: использовать Gradle или Maven для управления сборками, оба из которых соблюдения/обеспечивает структуру проекта, подобное это в любом случае.

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