Я загружаю свой файл свойств с помощью загрузчика классов следующим образом.

Properties prop = new Properties();
prop.load(MyClass.class.getResourseAsStream("/Property.properties"));

Теперь, используя этот метод, я могу читать файл свойств. Я хочу записать данные в файл свойств. Я не знаю путь к файлу свойств. Как тогда мне сохранить данные в файле свойств?

Обновить

Я пробовал следующее, но это не дает мне правильного пути:

File propFile = new File("Property.properties");
System.out.println(propFile.getAbsolutePath());
1
Shreyas 29 Фев 2016 в 23:09

3 ответа

Лучший ответ

Я не думаю, что вы можете универсальным способом, который всегда будет работать, потому что ваш файл свойств может быть помещен в банку и т. Д. Вы можете получить URL-адрес через getResource (String), а затем что-то сделать с этим URL-адресом, например, если это URL-адрес файла, вы можете получить там имя файла.

 URL u=MyClass.class.getResource("/Property.properties");
 if ("file".equals(u.getProtocol()){
    File f=new File(u.toURI());
 }

Но это не сработает во всех случаях.

Я бы записал измененное значение в файл в хорошо известном месте и использовал бы связанные свойства в качестве значения по умолчанию, которые заменяются значениями в файле.

1
JP Moresmau 29 Фев 2016 в 20:17

По сути, получите ресурс как OutputStream, а затем передайте его методу store () вашего объекта Properties.

Подробности здесь:

http://www.drdobbs.com/jvm/readwrite-properties-files-in-java/231000005

0
ManoDestra 29 Фев 2016 в 20:18

Ваш вопрос состоит из двух частей.

Во-первых, часть для чтения. Вы сказали: «Я загружаю свой файл свойств ...», используя предоставленный вами код. Этот код рассматривает файл как «ресурс» и загружает его с помощью загрузчика классов. Здесь появляется механизм загрузчика классов в среде выполнения Java. Грубо говоря, этот механизм ищет его в текущем пути к классам вашего приложения и делает входной поток , связанный с первым подходящим ресурсом, доступным вашему коду. В вашем случае это может быть нормально, однако вы должны понимать, что если есть несколько файлов свойств с одним и тем же именем в разных частях вашего пути к классам (например, разные файлы JAR, имеющие один и тот же файл конфигурации), тогда вы можете не знать, какой файл читается. Единственный способ убедиться, что вы читаете правильный файл из пути к классам, - это убедиться, что у вас есть этот файл конфигурации в уникальном месте в пути к классам вашего приложения.

Кажется, это работает для вас. Чтение из файла проще, чем, скажем, запись в файл.

Во второй части вы хотите записать в файл . Важно отметить, что вы должны знать точное местонахождение файла, в который вы пишете. Если вы неосознанно конвертируете его в выходной поток, вы можете в конечном итоге попытаться записать в поток, в который вам не разрешено писать. Итак, здесь вы должны попытаться найти местоположение (путь) реального физического файла, например, на жестком диске компьютера. Этот путь вы должны знать, прежде чем писать и запускать эту программу. Помните, что файл всегда существует в папке или каталоге.

Ваша попытка:

File propFile = new File("Property.properties");
System.out.println(propFile.getAbsolutePath());

Найти местоположение или путь к файлу, в который вы хотите записать, не удается, потому что, когда вы делаете new File("Property.properties");, Java пытается обратиться к файлу (пока ничего не делает с операционной системой), который находится в текущем рабочий каталог. Это относится к местоположению, заданному System.getProperty("user.dir"). Итак, ваш propFile относится к (гипотетическому) файлу в этой папке, и вызов getAbsolutePath() выводит его путь. Это не тот файл, который вам нужен, потому что вы пытаетесь записать в файл, путь к которому вам неизвестен. Итак, вы должны найти путь к файлу, а затем использовать BufferedWriter, поддерживаемый FileWriter или BufferedOutputStream, поддерживаемый FileOutputStream для записи в этот файл. Убедитесь, что файл, в который вы хотите выполнить запись, существует и у вас есть разрешение на запись в него.

1
Kedar Mhaswade 29 Фев 2016 в 20:58