Java 如何读取/写入用冒号分隔键和值的属性文件';:';而不是相等的'=';

Java 如何读取/写入用冒号分隔键和值的属性文件';:';而不是相等的'=';,java,properties-file,Java,Properties File,我有一个属性文件,其中包含键:值列表,如下所示: key1 : value1 key2 : value2 如何使用Properties类读取和写入此文件?这是可能的还是不可能的?是的。你考虑过试一试吗?还是咨询客户 该键包含行中的所有字符,从第一个非空格字符开始,到第一个未转义的“=”、“:”或除行终止符以外的空格字符,但不包括这些字符。所有这些键终止字符都可以通过使用前面的反斜杠字符转义而包含在键中;比如说, 核心解决方案 将此文件作为文本文件读入字符串 将:替换为= 从字符串解析属性,请参

我有一个属性文件,其中包含键:值列表,如下所示:

key1 : value1
key2 : value2

如何使用Properties类读取和写入此文件?这是可能的还是不可能的?

是的。你考虑过试一试吗?还是咨询客户

该键包含行中的所有字符,从第一个非空格字符开始,到第一个未转义的“=”、“:”或除行终止符以外的空格字符,但不包括这些字符。所有这些键终止字符都可以通过使用前面的反斜杠字符转义而包含在键中;比如说,

核心解决方案

  • 将此文件作为文本文件读入字符串

  • 替换为
    =

  • 从字符串解析属性,请参阅


  • 如果要将属性写入文件,请按相反的顺序执行相同的操作。将属性写入字符串,将
    =
    替换为
    ,然后将字符串写入文件。

    您可以使用下面的代码读取属性文件。请注意“:”的工作原理与“=”相同

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

    我查看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();
    }
    
    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;
    }
    
    并通过以下方法更新文件:

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

    这不是很好的解决方案;我在java属性类中调试和搜索,发现java使用“=”常量来表示write key=value。@M2E67您可能应该将其添加到您的问题中,因为您并没有说您在编写
    =
    时有问题(是的,它不会是
    ,但从其他答案来看,似乎属性可以同时使用
    =
    ,因此这是您的附加要求)