houzhongfei 2015-11-18 08:02 采纳率: 50%
浏览 1619
已采纳

按节点取出.properties中的数据问题 有点小挑战

pro.properties文件配置如下
[Default]
team = happy team

[Project]
Dev = Harry
From = %team%
age = 20
Des = %Dev%, from %From%, %age% yeas old

用什么办法可以按节点将其中的数据取出?
范例:
getString(Project,Des)意思取出节点Project下的Des 结果为:Harry,from Happy Team ,20 years old
getInteger(Project,age)意思是取出节点Project下的age 结果为:20
求老师指点一下

  • 写回答

3条回答 默认 最新

  • zlp1992 2015-11-18 14:21
    关注

    代码如下,先解析文件再保存:

     import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Set;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    public class FileParser {
        private HashMap<String,HashMap<String, String>> dataHashMap;
        private String filePath;
        private String patternString="%[A-Za-z]+%";
        private Pattern pattern=Pattern.compile(patternString);
        public FileParser(String filePath){
            this.filePath=filePath;
            dataHashMap=new HashMap<String,HashMap<String,String>>();
        }
        public String getString(String nodeKey,String valueKey){
            Set<String> nodeKeys=dataHashMap.keySet();
            for(String key:nodeKeys){
                if(key.equals(nodeKey)){
                    HashMap<String,String> map=dataHashMap.get(key);
                    return map.get(valueKey);
                }
            }
            return null;
        }
        public int getInteger(String nodeKey,String valueKey){
            Set<String> nodeKeys=dataHashMap.keySet();
            for(String key:nodeKeys){
                if(key.equals(nodeKey)){
                    HashMap<String,String> map=dataHashMap.get(key);
                    return Integer.parseInt(map.get(valueKey));
                }
            }
            return -1;
        }
        public void parse(){
            try {
                boolean isNewNode=false;
                FileReader reader=new FileReader(filePath);
                BufferedReader buf=new BufferedReader(reader);
                String str=null;
                String nodeKey=null;
                while((str=buf.readLine())!=null){
                    if(str.startsWith("[")){ //新的节点
                        isNewNode=true;
                        nodeKey=str.substring(str.indexOf("[")+1,str.indexOf("]")); 
                        HashMap<String,String> map=new HashMap<String,String>();
                        dataHashMap.put(nodeKey, map);
                    }
                    if(!isNewNode){
                        HashMap<String,String> detail=dataHashMap.get(nodeKey);
                        String detailKey=str.substring(0,str.indexOf("=")).trim();
                        String detailValue=str.substring(str.indexOf("=")+1).trim();
                        String newDetailValue=null;
                        if(detailValue.contains("%")){ //因为可能包含%
                            Matcher matcher=pattern.matcher(detailValue);
                            while(matcher.find()){              
                                String matchString=matcher.group();
                                String keyString=matchString.replace("%","");
                                String valueString=null;
                                Set<String> keysSet=dataHashMap.keySet();
                                for(String key:keysSet){
                                    HashMap<String,String> nodeValueMap=dataHashMap.get(key);
                                    valueString=nodeValueMap.get(keyString);
                                    if(valueString!=null)
                                        break;
                                }
                                newDetailValue=detailValue.replaceFirst(matchString, valueString);
                                detailValue=newDetailValue;
                                matcher=pattern.matcher(detailValue);
                            }
                        }
                        detail.put(detailKey, detailValue);
                    }
                    isNewNode=false;
                }
                buf.close();
                reader.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("保存的数据为:"+dataHashMap);
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            FileParser fileParser=new FileParser("D:\\pro.properties");
            fileParser.parse();
            System.out.println(fileParser.getString("Project","Des"));
            System.out.println(fileParser.getInteger("Project", "age"));
        }
    
    }
    
    

    结果如下:
    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效