У меня есть файл свойств, который содержит ключ: список значений, таких как:

key1 : value1
key2 : value2

Как я могу читать и писать этот файл с классом свойств? Это возможно или нет?

0
M2E67 28 Фев 2018 в 12:42

4 ответа

Лучший ответ

Я посмотрел класс свойств java (в jdk) и обнаружил, что java использует константу '=' для сохранения файла свойств следующим методом:

private void store0(BufferedWriter bw, String comments, boolean escUnicode)
    throws IOException
{
    if (comments != null) {
        writeComments(bw, comments);
    }
    bw.write("#" + new Date().toString());
    bw.newLine();
    synchronized (this) {
        for (Enumeration<?> e = keys(); e.hasMoreElements();) {
            String key = (String)e.nextElement();
            String val = (String)get(key);
            key = saveConvert(key, true, escUnicode);
            /* No need to escape embedded and trailing spaces for value, hence
             * pass false to flag.
             */
            val = saveConvert(val, false, escUnicode);
            bw.write(key + "=" + val);
            bw.newLine();
        }
    }
    bw.flush();
}

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

public Map read(String path) {
    ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
    try {
        File file = new File(path);
        Map map = mapper.readValue(file, Map.class);
        return map;
    } catch (Exception e) {
        logger.error("Error during read Yml file {}", path, e);
    }
    return new HashMap();
}

И обновите файл следующим способом:

public boolean update(String path, Map content) {
    try {
        YAMLFactory yamlFactory = new YAMLFactory();
        yamlFactory.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES);

        File file = new File(path);
        ObjectMapper mapper = new ObjectMapper(yamlFactory);
        ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter();
        writer.writeValue(file, content);
        return true;
    } catch (Exception e) {
        logger.error("Error during save Yml file {}", path, e);
    }
    return false;
}

Важно использовать следующий код для предотвращения использования двойных кавычек для значений:

yamlFactory.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES);
1
M2E67 28 Фев 2018 в 10:46

Да. Рассматривали ли вы попробовать это? или обратитесь в документация ?

Ключ содержит все символы в строке, начиная с первого непробельного символа и вплоть до, но не включая, первый неэкранированный символ '=', ':' или символ пробела, отличный от ограничителя строки. Все эти ключевые символы завершения могут быть включены в ключ, экранируя их предшествующим символом обратной косой черты; например,

0
user207421 28 Фев 2018 в 09:53

Хардкорное решение.

  1. Прочитайте этот файл как текстовый файл в строку. См. пример.

  2. Замените : на =.

  3. Разбор свойств из String, см. Разбор строки как свойств

    public Properties parsePropertiesString(String s) {
        final Properties p = new Properties();
        p.load(new StringReader(s));
        return p;
    }
    

И если вы хотите записать свойства в файл, сделайте то же самое в обратном порядке. Запишите свойства в строку, замените = на : и запишите эту строку в файл.

0
Yan Khonski 28 Фев 2018 в 09:56

Вы можете использовать приведенный ниже код для чтения файла свойств. Обратите внимание: ':' будет работать так же, как и '='.

try (InputStream in = new FileInputStream("filename.propeties")) {
    Properties prop = new Properties();
    prop.load(in);


    for (String key: prop.stringPropertyNames()) {
        String value = prop.getProperty(key);
        System.out.println(key+ "=" + value);
    }
} catch (IOException e) {
    e.printStackTrace();
}
0
kryger 28 Фев 2018 в 10:24