Как я могу ссылаться на ресурс в Java? - PullRequest
11 голосов
/ 16 сентября 2010

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

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

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

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

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

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

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

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

Ответы [ 2 ]

34 голосов
/ 16 сентября 2010

Используйте 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");
0 голосов
/ 16 сентября 2010

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

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

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

...