Как переписать одно свойство в .properties, не перезаписывая весь файл? - PullRequest
26 голосов
/ 18 сентября 2011

По сути, я должен перезаписать определенное свойство в файле .properties через приложение Java, но когда я использую Properties.setProperty () и Properties.Store (), он перезаписывает весь файл, а не только это одно свойство.

Я пытался создать FileOutputStream с append = true, но при этом он добавляет другое свойство и не удаляет / не перезаписывает существующее свойство.

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

Редактировать: я пытался прочитать файл и добавить к нему.Вот мой обновленный код:

FileOutputStream out = new FileOutputStream("file.properties");
FileInputStream in = new FileInputStream("file.properties");
Properties props = new Properties();

props.load(in);
in.close();

props.setProperty("somekey", "somevalue");
props.store(out, null);
out.close();

Ответы [ 8 ]

20 голосов
/ 18 сентября 2011

API Properties не предоставляет никаких методов для добавления / замены / удаления свойства в файле свойств. Модель, поддерживаемая API, заключается в загрузке всех свойств из файла, внесении изменений в объект Properties в памяти, а затем сохранении всех свойств в файл (тот же или другой).

Но API Properties не является чем-то необычным в этом отношении. В действительности, обновление текстового файла на месте трудно реализовать без перезаписи всего файла. Эта трудность является прямым следствием того, как файлы / файловые системы реализуются современной операционной системой.

Если вам действительно нужно делать инкрементные обновления, вам нужно использовать какую-то базу данных для хранения свойств, а не файл ".properties".


Другие Ответы предложили следующий подход в различных ипостасях:

  1. Загрузка свойств из файла в Properties объект.
  2. Обновление Properties объект.
  3. Сохранить Properties объект поверх существующего файла.

Это работает для некоторых вариантов использования. Однако загрузка / сохранение может изменить порядок свойств, удалить встроенные комментарии и пробелы. Эти вещи могут имеют значение 1 .

Другой момент заключается в том, что для этого необходимо переписать весь файл свойств, чего ОП явно пытается избежать.


1 - Если API используется по назначению, порядок свойств, встроенные комментарии и т. Д. не будут иметь значения . Но давайте предположим, что ОП делает это по «прагматическим причинам».

14 голосов
/ 20 марта 2013

Вы можете использовать PropertiesConfiguration из Конфигурация Apache Commons .

В версии 1.X:

PropertiesConfiguration config = new PropertiesConfiguration("file.properties");
config.setProperty("somekey", "somevalue");
config.save();

С версии 2.0:

Parameters params = new Parameters();
FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
    new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
    .configure(params.properties()
        .setFileName("file.properties"));
Configuration config = builder.getConfiguration();
config.setProperty("somekey", "somevalue");
builder.save();
3 голосов
/ 26 сентября 2011

Другой ответ напомнил мне о библиотеке Apache Commons Configuration , в частности о возможностях PropertiesConfigurationLayout .

Это позволяет (более или менее) сохранить исходный макет, комментарии, порядок и т. Д.

1 голос
/ 04 октября 2016

Я делаю следующий метод: -

  1. Считать файл и загрузить объект свойств
  2. Обновите или добавьте новые свойства, используя метод ".setProperty". (метод setProperty лучше, чем метод .put, поскольку его можно использовать как для вставки, так и для обновления объекта свойства)
  3. Запишите объект свойства обратно в файл, чтобы синхронизировать файл с изменением.
1 голос
/ 18 сентября 2011

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

Для этого я бы использовал Настройки API.

0 голосов
/ 16 июня 2017

Да, это возможно. Если вы не хотите удалять свой контент из файла свойств. Просто прочитайте и замените строку из файла.

    String file="D:\\path of your file\abc.properties";     
    Path path = Paths.get(file);
    Charset charset = StandardCharsets.UTF_8;

    String content = new String(Files.readAllBytes(path), charset);
    content = content.replaceAll("name=anything", "name=anything1");
    Files.write(path, content.getBytes(charset));

Приведенный выше код не удалит содержимое из вашего файла. Он просто заменяет часть содержимого из файла.

0 голосов
/ 25 июня 2013
public class PropertiesXMLExample {
    public static void main(String[] args) throws IOException {

    // get properties object
    Properties props = new Properties();

    // get path of the file that you want
    String filepath = System.getProperty("user.home")
            + System.getProperty("file.separator") +"email-configuration.xml";

    // get file object
    File file = new File(filepath);

    // check whether the file exists
    if (file.exists()) {
        // get inpustream of the file
        InputStream is = new FileInputStream(filepath);

        // load the xml file into properties format
        props.loadFromXML(is);

        // store all the property keys in a set 
        Set<String> names = props.stringPropertyNames();

        // iterate over all the property names
        for (Iterator<String> i = names.iterator(); i.hasNext();) {
            // store each propertyname that you get
            String propname = i.next();

            // set all the properties (since these properties are not automatically stored when you update the file). All these properties will be rewritten. You also set some new value for the property names that you read
            props.setProperty(propname, props.getProperty(propname));
        }

        // add some new properties to the props object
        props.setProperty("email.support", "donot-spam-me@nospam.com");
        props.setProperty("email.support_2", "donot-spam-me@nospam.com");

       // get outputstream object to for storing the properties into the same xml file that you read
        OutputStream os = new FileOutputStream(
                System.getProperty("user.home")
                        + "/email-configuration.xml");

        // store the properties detail into a pre-defined XML file
        props.storeToXML(os, "Support Email", "UTF-8");

        // an earlier stored property
        String email = props.getProperty("email.support_1");

        System.out.println(email);
      }
   }
}

Вывод программы будет:

support@stackoverflow.com
0 голосов
/ 15 марта 2013
import java.io.*;
import java.util.*;
class WritePropertiesFile
{
    public static void main(String[] args) {
        try {
            Properties p = new Properties();
            p.setProperty("1", "one");
            p.setProperty("2", "two");
            p.setProperty("3", "three");

            File file = new File("task.properties");
            FileOutputStream fOut = new FileOutputStream(file);
            p.store(fOut, "Favorite Things");
            fOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...