Как правильно использовать относительные пути?
Когда я создаю File и как аргумент указываю "src/tetris/YellowBrick.png", где src - папка, находящаяся в папке проекта и запускаю программу через NetBeans, то абсолютный путь определяется корректно (D:\Codes\Tetris\src\tetris\BlueBrick.png), но если я запущу непосредственно jar файл, то путь будет определяться как C:\Users\user\src\tetris\BlueBrick.png. Пожалуйста, подскажите как это можно решить.
Ответы (1 шт):
Когда используется доступ к файлу и путь к файлу относительный (т.е. начинается не с /), то файл ищется относительно текущей рабочей директории процесса, в котором такой вызов происходит.
В этих двух описанных случаях программы запускаются из разных директорий, путь к файлу указан для одного из случаев (т.е. он "правильный" только тогда, когда запуск идет из IDE) и в другом, ожидаемо, не находится.
Судя по названию файла, это не параметр, который пользователь может изменить, а ресурс, который приготовил программист заранее и программа его использует в работе. В таком случае правильным решением будет настроить сборку проекта таким образом, чтоб файл ресурса попадал в classpath и изменить программу, чтобы она его загружала из classpath, а не из файла.
В случае запуска из IDE, это означает, что нужно либо добавить папку с ресурсами в classpath, либо настроить проект, чтоб файлы ресурсов копировались в директорию выходных файлов.
В случае jar файла, нужно настроить сборку таким образом, чтоб ресурс копировался в jar файл. Если вы собираете jar файл из IDE, то настройки для копирования ресурсов обычно добавляют файлы ресурсов и в jar.
Но лучше всего использовать для сборки maven/gradle и структуру проекта maven. IDE умеют с ней работать без дополнительных настроек и там предусмотрена специальная папка для ресурсов.
Загрузку файла из classpath нужно делать используя getClass().getClassLoader().getResourceAsStream, смотрите подробности, например, тут