Как прочитать файл свойств в 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")?