Как прочитать файл свойств в java извне папки класса?

У меня есть следующая структура пути к основному классу:

D:/java/myapp/src/manClass.java

и я хочу поместить файл свойств в

D:/java/myapp/config.properties

который будет содержать имя файла и некоторые другие конфигурации. Я установил имя файла в файле свойств следующим образом: file=file_to_read.txt

этот file_to_read.txt будет расположен в D:/java/myapp/folder_of_file/

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

Я могу сделать это, если оба config.properties и file_to_read.txt находятся в src/ с помощью mainClass.java. Но не удалось добиться успеха с тем, как я хочу это сделать.

Может кто-нибудь мне помочь? Мне нужно ваше предложение о том, что я могу сделать, если я хочу поместить папку myapp в любом месте моего диска с той же внутренней структурой, в которой я описал выше, и программа выполнит работу правильно.

Мне также нужно ваше предположение, что если я хочу выполнить задание из банки, созданной после создания проекта, могу ли я сделать это без каких-либо проблем?

Я пробовал читать только файл свойств:

        URL location = myClass.class.getProtectionDomain().getCodeSource().getLocation();

        String filePath = location.getPath().substring(1,location.getPath().length());

        InputStream in = myClass.class.getResourceAsStream(filePath + "config.properties");
        prop.load(in);

        in.close();

        System.out.println(prop.getProperty("file"));

Но это дает ошибку при попытке getProperty из файла свойств. Спасибо!

Ответы

Ответ 1

Как прочитать файл свойств в java из вне папки класса?

Используйте FileInputStream с пути к файловой системе с фиксированным диском.

InputStream input = new FileInputStream("D:/java/myapp/config.properties");

Намного лучше просто перенести его на один из существующих путей, охватываемых classpath, или добавить исходный путь D:/java/myapp/ к пути к классам. Затем вы можете получить его следующим образом:

InputStream input = getClass().getResourceAsStream("/config.properties");

или

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");

Ответ 2

Спасибо всем за ваши предложения. Я выполнил эту задачу следующим образом:

        Properties prop = new Properties();
        String dir = System.getProperty("user.dir");
        InputStream in = new FileInputStream(dir + "/myapp/config.properties");
        prop.load(in);
        in.close();
        String filePath = dir + "/myapp/folder_of_file/" + prop.getProperty("file"); /*file contains the file name to read*/

Ответ 3

Properties property=new Properties();
property.load(new FileInputStream("C:/java/myapp/config.properties"));

Ответ 4

Вам нужно указать абсолютный путь, но вы не должны жестко его кодировать, так как это затруднит переход между средой разработки и производства и т.д.

Вы можете получить базовый путь файла (ов) из свойства System, доступ к которому вы можете получить, используя System.getProperty( "basePath" ) в своем коде и который должен быть добавлен к имени вашего файла, чтобы создать абсолютный путь.

При запуске приложения вы можете указать путь в командной строке java следующим образом:

java -DbasePath="/a/b/c" ...

... означает текущие аргументы вашей команды Java для запуска вашей программы.

Ответ 5

Вы можете добавить каталог конфигурационного файла в путь к среде выполнения, затем вы можете получить к нему доступ с помощью Class.getResourceAsStream().

Ответ 6

Вы можете добавить местоположение этого файла в системное свойство java.class.path в программе и использовать getSystemResource ("config.properties")?