Как перезаписать одно свойство.свойства без перезаписи всего файла?

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

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

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

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

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 ответов


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

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

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


Вы можете использовать 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();

другой ответ напомнил мне о Конфигурация Apache Commons библиотека, в частности возможности PropertiesConfigurationLayout.

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


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

для этого я использую предпочтения API-интерфейс.


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

  1. прочитайте файл и загрузите объект свойств
  2. обновить или добавить новые свойства с помощью ".методов-setproperty метод". (метод setProperty лучше, чем .метод put, как он может использоваться для вставки, а также обновления объекта свойства)
  3. Добавить объект недвижимости обратно в файл, чтобы сохранить файл в синхронизации с изменениями.

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();
        }

    }
}

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

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

    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));

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