Правильный путь для использования ClassLoader.getResource ()?

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

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.

РЕДАКТИРОВАТЬ: папка «res», содержащая файл .spt, теперь находится в «корзине» проекта, а не в корневом каталоге, но я все равно получаю сообщение об ошибке. При запуске из среды IDE или в виде экспортированного файла .jar я все равно получаю NullPointerException, куда я должен поместить эти файлы? Кто-нибудь может дать мне скриншот или пример?


person user2649681    schedule 02.02.2015    source источник
comment
Вы можете открыть файл .jar с помощью инструмента для архивирования и найти путь, по которому находится ваш файл, или у вас есть веб-проект?   -  person Andy_Lima    schedule 02.02.2015
comment
ClassLoader загружает ресурсы из пути к классам. Если файл находится в корне проекта, он не компилируется Eclipse в выходной каталог и, следовательно, не находится в пути к классам во время выполнения. Поместите файл в каталог источников, если вы хотите, чтобы он находился в пути к классам во время выполнения.   -  person JB Nizet    schedule 02.02.2015
comment
с res / + filename, означает ли это, что я хочу создать папку в src с именем res, а затем поместить туда файлы?   -  person user2649681    schedule 02.02.2015
comment
да. Поместите его в свою папку src   -  person Dioxin    schedule 02.02.2015


Ответы (1)


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

Например, у вас может быть:

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

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

getResource("fonts/" + fileName)

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

person E-Riz    schedule 02.02.2015