Как ссылаться на ресурс в Java?

Мне нужно прочитать файл в моем коде. Он физически находится здесь:

C:\eclipseWorkspace\ProjectA\src\com\company\somePackage\MyFile.txt

Я поместил его в исходный пакет, чтобы при создании файла runnable jar (Export- > Runnable JAR file) он включался в банку. Первоначально я получил его в корне проекта (а также пробовал обычную подпапку), но экспорт не включал его в банку.

Если в моем коде я:

File myFile = new File("com\\company\\somePackage\\MyFile.txt");

файл jar правильно находит файл, но работает локально (Run As- > Java Main application) выдает исключение, не найденное в файле, потому что он ожидает, что он будет:

File myFile = new File("src\\com\\company\\somePackage\\MyFile.txt");

Но это не удается в моем файле jar. Итак, мой вопрос: как мне заставить эту концепцию работать как для локального, так и для моего jar файла?

Ответ 1

Используйте ClassLoader.getResourceAsStream или Class.getResourceAsStream. Основное различие между ними состоит в том, что версия ClassLoader всегда использует "абсолютный" путь (в файле jar или что-то еще), тогда как версия Class относится к самому классу, если вы не префикс пути с помощью /.

Итак, если у вас есть класс com.company.somePackage.SomeClass и com.company.other.AnyClass (внутри того же загрузчика классов, что и ресурс), вы можете использовать:

SomeClass.class.getResourceAsStream("MyFile.txt")

или

AnyClass.class.getClassLoader()
              .getResourceAsStream("com/company/somePackage/MyFile.txt");

или

AnyClass.class.getResourceAsStream("/com/company/somePackage/MyFile.txt");

Ответ 2

Если я разместил файл я в файле jar, он работал только тогда и только тогда, когда я использовал

...getResourceAsStream("com/company/somePackage/MyFile.txt")

Если я использовал объект File, он никогда не работал. У меня также есть исключение FileNotFound. Теперь я остаюсь с объектом InputStream.