【问题标题】:Java - How to read a colon from property file without escaping inside file? [duplicate]Java - 如何从属性文件中读取冒号而不转义文件内? [复制]
【发布时间】:2018-09-01 07:58:19
【问题描述】:

我有一个配置文件“Replace_IP_List.cfg”,如下所示

10.19.120.39=[fec0:1111:2222:3333:4444]
[fec0:2222:2222:3333:4444] = 10.18.215.151

我正在读取 cfg 文件以获取键和值,因为键有 ':' ,我无法获得完整的字符串,

Properties prop = new Properties();
    InputStream is = new FileInputStream("Replace_IP_List.cfg");

    prop.load(is);
    Enumeration<?> e = prop.propertyNames();
    while (e.hasMoreElements())
    {
        String key = (String) e.nextElement();
        String value = prop.getProperty(key);
        System.out.println("Key : " + key + ", Value : " + value);
        str=str.replace(key, value);

输出:

Key : 10.19.120.39, Value : [fec0:1111:2222:3333:4444]
Key : [fec0, Value : 2222:2222:3333:4444] = 10.18.215.151

cfg 文件是运行时生成的(或由其他人提供)我不需要编辑 cfg 文件或转义为:

任何人都可以建议我在程序内部如何逃脱:并且在阅读文件时只考虑=。预期输出如下,

Key : 10.19.120.39, Value : [fec0:1111:2222:3333:4444]
Key : [fec0:2222:2222:3333:4444], Value : 10.18.215.151

【问题讨论】:

  • 是什么阻止你只用= 分割每一行? = 符号似乎是唯一的分隔符。
  • 我的意思是当 prop.load 被调用时,它需要默认分隔符 := ,任何选项仅将 = 设置为分隔符?

标签: java properties


【解决方案1】:

一种方法可能是克隆您的属性文件,同时转义等号前面的冒号并在帮助程序类中读取该属性文件,例如:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.util.Enumeration;
import java.util.Properties;

public class PropertyFileHelper {

    class FakeReader extends Reader {

        private Reader in;
        private File file;

        public FakeReader(Reader in) throws IOException {

            file = File.createTempFile("dummy", "dummuy");

            try(
                    BufferedReader r = new BufferedReader(in);
                    BufferedWriter w = new BufferedWriter(new FileWriter(file));
                    ){

                String line;
                while((line = r.readLine()) != null) {
                    if(line.contains(":") && line.contains("=") && line.indexOf(':') < line.indexOf('=')){
                        String modifiedLine = "";
                        boolean equalFetched = false;
                        for(char c : line.toCharArray()) {
                            modifiedLine = modifiedLine.concat(equalFetched ? "" : ( c == ':' ? "\\" : "") + c) ;
                            equalFetched = c == '=';
                        }
                        line = modifiedLine;
                    }
                    w.write(line);
                    w.newLine();
                }
            }
            this.in = new FileReader(file);
        }

        @Override
        public int read(char[] cbuf, int off, int len) throws IOException {
            return in.read(cbuf, off, len);
        }

        @Override
        public void close() throws IOException {
            this.in.close();
        }

    }

    private void test() throws IOException {

        Properties prop = new Properties();

        prop.load(new FakeReader(new FileReader("/home/guest/Desktop/p.properties")));

        Enumeration<?> e = prop.propertyNames();
        while (e.hasMoreElements())
        {
            String key = (String) e.nextElement();
            String value = prop.getProperty(key);
            System.out.println("Key : " + key + " Value : " + value);
        }

    }

    public static void main(String[] args) throws IOException {
        new PropertyFileHelper().test();
    }

}

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 2012-05-28
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多