JAVA SE踩坑实践——解析读写 ini配置文件,简易键值对存储类,AES加解密算法

版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/sinat_34820292 https://blog.csdn.net/sinat_34820292/article/details/80794655

解析ini配置文件,ini配置文件格式如下:
这里写图片描述

分为小节:[section]
键值对: key=value

package com.cdr.printer.view;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.alibaba.fastjson.JSON;

public class ConfigIni {
    public static String defalutSection = "12345678";
    public Map<String, Map<String,String>> map = new HashMap<String, Map<String,String>>();
    File fi = new File("file\\config.ini");
    public ConfigIni(String file) {
        this(new File(file));
    }

    public ConfigIni(File file) {
        this();
        fi=file;
    }

    public ConfigIni() {
        super();
//      System.out.println("初始化完成");
    }

    // 是否为一个session
    private boolean isSection(String str) {
        return  Pattern.matches("^\\s*\\[.+\\]\\s*$", str);
    }

    // 是否是key-value
    private boolean isKeyValue(String str) {
        return Pattern.matches(".*=.*", str);  
    }

    // 是否为有注释 ;
    private boolean haveComment(String str) {
        return Pattern.matches(";", str);   
    }

    // 获得section
    private String getSection(String line) {
        String pattern = "\\[(.+)\\]";  
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(line);
        if (m.find()) {
            return m.group(1).trim();
        }else {
            return null;
        }
    }

    // 获得key
    private String getKey(String line) {
        String pattern = "(.+)=.*";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(line);
        if (m.find()) {
            return m.group(1).trim();
        }else {
            return null;
        }
    }

    // 获得value
    private String getValue(String line) {
        String pattern = ".+=(.*)";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(line);
        if (m.find()) {
            return   m.group(1).trim();
        }else {
            return null;
        }
    }

    // 加载配置
    private Map initIni() {
        SymmetricEncoder se=new SymmetricEncoder(); // AES对称加密类,不详细解释
        try {
            if(!fi.exists()) {
                if(!fi.getParentFile().exists())
                    fi.getParentFile().mkdirs();
                fi.createNewFile();
            }

            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fi),"UTF-8"));
            String line = null;
            String sstr = defalutSection;
            Map<String, String> sesion =  new HashMap<String,String>();
            map.put(sstr, sesion);
            while ((line = br.readLine()) != null) {
                line = se.AESDncode(defalutSection, line);// 这里实际不需要,后来加上的,存到文件里的是加密后的
                if(isSection(line)) {
                    sstr = getSection(line);
                    sesion = new HashMap<String,String>();
                    map.put(sstr, sesion);
                }else if(isKeyValue(line)) {
                    sesion.put(getKey(line), getValue(line)); // 这里实际不需要,后来加上的,存到文件里的是加密后的
                }
            }
            br.close();
        } catch (Exception e) {
            System.err.println("read errors :" + e);
        }
//      System.out.println(JSON.toJSONString(map));
        return map;
    }

    // 写配置
    private String saveToIni() {
        SymmetricEncoder se=new SymmetricEncoder(); // AES加密类
        try {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fi), "UTF-8"));
            for (String name : map.keySet()) {
                if(!name.equals(defalutSection)) {
                    String str = se.AESEncode(defalutSection, "["+name + "]"); // 这里实际不需要,后来加上的,存到文件里的是加密后的
                    bw.write(str);
                    bw.newLine();
                }
                Map topic = map.get(name);
                Set<String> keySet = topic.keySet();
                for(String ke : keySet) {
                    String str = se.AESEncode(defalutSection, ke + "=" +topic.get(ke)); // 这里实际不需要,后来加上的,存到文件里的是加密后的
                    bw.write(str);
                    bw.newLine();
                }
                bw.newLine();
            }
            bw.close();
        } catch (Exception e) {
            System.err.println("write errors :" + e);
        }
        return "";
    }

    // 获取配置值
    public String get(String topic,String key,String dft) {
        Map<String, String> tt = map.get(topic);
        if(tt==null) return dft;
        String string = tt.get(key);
        return string==null?dft:string;
    }

    // 设置值
    public String set(String topic,String key,String value) {
        Map<String, String> tt = map.get(topic);
        if(tt==null) {
            tt = new HashMap<String,String>();
            map.put(topic, tt);
        }
        tt.replace(key, value);
        return tt.put(key, value);
    }
    // key value存储
    public String kv(String key,String value) {
        initIni();
        return map.get(defalutSection).put(key, value) + saveToIni();
    }
    public String kv(String key) {
        initIni();
        return map.get(defalutSection).get(key);
    }
    public static void main(String[] args) {
        System.out.println(new ConfigIni().kv("1651"));
    }
}

此处省略加密解密类的具体实现,有兴趣可参考其他博主的文章:
aes加密算法java代码实现
AES对称加密(Rijndael算法)
java实现AES加密解密–数据加解密

猜你喜欢

转载自blog.csdn.net/sinat_34820292/article/details/80794655