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

问题描述

按节点取出.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
求老师指点一下

解决方案

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

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

}

结果如下:

解决方案二:

按行读取文件,然后自己解析吧

解决方案三:

ResourceBundle resourceBundle = ResourceBundle.getBundle(fileName);
return resourceBundle.getString(key);

  • @param name src下properties文件路径与名称
  • @param key 要取值的健
  • @return 返回属性文件的值
时间: 2024-08-02 10:08:22

java-按节点取出.properties中的数据问题 有点小挑战的相关文章

java正则截取出javascript中的json代码片段。

问题描述 java正则截取出javascript中的json代码片段. 在做爬虫的时候,爬出一个页面大量包含 var aa = {json_aa}; var bb= {json_bbb}; var cc = {json_cccc}; JAVA中如何用正则表达式截取出某个JS定义的JSON对象,如bb变量后的{json_bbb}; 数据用来转换JAVA对象进行处理. 谢谢! 解决方案 首先已经爬取到上面的数据,你可以正则获取到 var bb= {json_bbb}; 这样的数据. java 中有可

网页-使用java如何获得highcharts图表中的数据

问题描述 使用java如何获得highcharts图表中的数据 网页上用highcharts绘制了图表,如何利用java代码抓取图表中的数据?图表网页 解决方案 没明白,数据不是在绘制图表的时候加进去的吗?

java获取两个数组中不同数据的方法_java

本文实例讲述了java获取两个数组中不同数据的方法.分享给大家供大家参考.具体实现方法如下: public static <T> List<T> compare(T[] t1, T[] t2) { List<T> list1 = Arrays.asList(t1); List<T> list2 = new ArrayList<T>(); for (T t : t2) { if (!list1.contains(t)) { list2.add(t)

使用DataStage Java Integration Stage和Java Pack从Excel源文件中提取数据

简介 IBM InfoSphere Information 服务器由一套可帮助企业从遍布多个数据源系统的信息中获取 业务价值的数据集成产品组成.它有助于以某种具有成本效益的方式从多个异构数据源中分析.清理和集成信 息.有了 IBM InfoSphere Information Server,企业能够以较低的成本和风险提高其运营效率. IBM Information Server DataStage 是一个 ETL 产品,可帮助组织提取.转换和加载来自异构数据源的数据. DataStage 可使用

MySQL取出表中排序数据且不重复 删除重复数据(1/2)

今日做一个功能需求,从表中排序取出前十个且数据不一致的数据,如下列a表中的值有以下数据:  代码如下 复制代码 mysql> select * from a; +----+----------+ | id | user | +----+----------+ | 1 | zhangsan | | 2 | lisi | | 3 | wangwu | | 4 | zhangsan | | 5 | zhaosi | | 6 | wangwu | | 7 | lisi | | 8 | lisi | | 

Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法_java

SqlSessionTemplateSqlSessionTemplate是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常.SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用. 当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的.此外,它管理session的生命周期,包含

Java中ResultSet数据自动填充到类中&amp;amp;类实例填充PreparedStatement

需求: (1)提取ResultSet中值到一个类中挺麻烦的,需要new一个变量,使用对应成员的Set方法赋值,能不能根据类的Class,直接提取出ResultSet中的数据,最后返回实例化的类? (2)可以用PreparedStatement预编译带变量的sql语句,在execute之前需要将变量值填充进去,一个一个设置太麻烦了,能不能提供一个类变量,使用类成员变量的值自动填充PreparedStatement? 这样的功能许多开源的框架可以实现,但是不想因为这么一点点的需求去学习那么庞大的一套

Java中的数据是怎么存储的?

问题描述 java中的数据有哪些存储方式,能详细介绍下么? 解决方案 在JAVA中,有六个不同的地方可以存储数据:1. 寄存器(register).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象.2. 堆栈(stack).位于通用RAM中,但通过它的"堆栈指针"可以从处理器哪里获得支持.堆栈指针若向下移动,则分配新的内存:若向上移动,则释放那些内存.

java从输入流中获取数据并返回字节数组示例_Android

复制代码 代码如下: import java.io.ByteArrayOutputStream;import java.io.InputStream;//从输入流中获取数据并以字节数组返回public class StreamTool {    /**     * 从输入流获取数据     * @param inputStream     * @return     * @throws Exception     */    public static byte[] readInputStrea