如何使用冒号':'而不是等于'='来分隔键和值的读/写属性文件

时间:2018-02-28 09:42:05

标签: java properties-file

我有属性文件,其中包含键:值列表,如下面的内容:

key1 : value1
key2 : value2

如何使用Properties类读取和写入此文件?这有可能与否?

4 个答案:

答案 0 :(得分:1)

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

因此,无法处理我的属性文件。但是对于erad / write我的属性文件,我发现这个文件是一个yaml foramt,我们可以通过这种方法轻松读取文件:

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 :(得分:0)

是。你考虑过试试吗?或咨询documentation

  

该键包含从第一个非空格字符开始的行中的所有字符,但不包括第一个未转义的'=',':'或除行结束符之外的空格字符。 。所有这些密钥终止字符都可以通过使用前面的反斜杠字符转义它们来包含在密钥中;例如,

答案 2 :(得分:0)

Hardcore解决方案。

  1. 将此文件作为文本文件读入String。 See example

  2. :替换为=

  3. 从String解析属性,请参阅Parsing string as properties

    public Properties parsePropertiesString(String s) {
        final Properties p = new Properties();
        p.load(new StringReader(s));
        return p;
    }
    
  4. 如果要将属性写入文件,请按相反顺序执行相同操作。将属性写入String,将=替换为:,并将该字符串写入文件。

答案 3 :(得分:0)

您可以使用以下代码来读取属性文件。请注意&#39;:&#39;将与&#39; =&#39;。

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