Вам нужно различать файлы и ресурсы. Каждый файл также является ресурсом, но не наоборот. Внутри JAR-файла у вас нет файлов, а только ресурсов.
Загрузка ресурсов также выполняется с помощью загрузчика классов. Поэтому вы должны сначала загрузить загрузчик классов, а затем загрузить ресурс:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL resourceUrl = loader.getResource(resourceName);
try (InputStream in = resourceUrl.openStream()) {
// load bytes from the input stream here
}
// process the loaded resource bytes here
Теперь, где разместить файлы? Вы можете либо поместить их в корень JAR. Внутри вашего проекта это означает, что файл ресурсов находится в папке src
. Или вы помещаете их в пакет, чтобы иметь их рядом с классом, который ему нужен.
Если вы помещаете его в корень, вы получаете доступ к ним только через имя ресурса. Если он помещен в подкаталог (пакет), вы должны префикс имени ресурса с этим путем - beginngin из корня. Пример:
URL resourceUrl = loader.getResource("my/pkg/win.txt");
Просто удобство: Если файл ресурса помещается в тот же пакет, как класса, нуждающегося этот ресурс, вы можете также использовать сам класс для загрузки (а не загрузчик классов):
URL resourceUrl = getClass().getResource("win.txt");
Обратите внимание, что в этом случае структура каталогов опущена.
В вашем примере вы создали файл-объект. Если вы использовали этот файловый объект для создания FileInputStream
позже, вы можете просто использовать InputStream
, который я описал выше, вместо этого.
Было бы проще, если бы вы не скрывали имена своих классов и пакетов. – PeterMmm