Как ссылаться на ресурс в 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.