Вы упомянули здесь несколько разных вещей, поэтому давайте разберемся с ними.
1) Создание URL "file:" на основе "user.dir"
Свойство «user.dir» относится к текущему рабочему каталогу, где бы он ни находился, когда запустил приложение. Вполне возможно, что записанные здесь файлы исчезнут между двумя запусками (поскольку пользователь может запускаться из другого каталога).
Свойство «user.home» относится к домашнему каталогу пользователя - оно должно оставаться неизменным между запусками.
В любом случае, используйте объект File для открытия файлов, не копайтесь с созданием URL «file:». Вы не получаете никакой выгоды, и, как видите, вы должны написать грязный код для доступа к нему.
2) Получение ресурса через загрузчик классов
Это предназначено для извлечения файлов, которые упакованы с вашим приложением - файлы только для чтения. Как вы видели, существует несколько вариантов. Я предпочитаю использовать следующее, потому что я предполагаю, что класс захочет загрузить файл, упакованный с ним.
InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);