zoukankan      html  css  js  c++  java
  • Properties文件工具类的使用--获取所有的键值、删除键、更新键等操作

      有时候我们希望处理properties文件,properties文件是键值对的文件形式,我们可以借助Properties类操作。

     工具类如下:(代码中日志采用了slf4j日志)

    package cn.xm.exam.utils;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Map.Entry;
    import java.util.Properties;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 操作properties文件的工具类(此工具类的file都是src目录下的properties文件,编译之后在build目录下)
     * 
     * @author QiaoLiQiang
     * @time 2018年11月3日下午12:05:32
     */
    public class PropertiesFileUtils {
        private static final Logger log = LoggerFactory.getLogger(PropertiesFileUtils.class);
    
        /**
         * 构造函数私有化
         */
        private PropertiesFileUtils() {
    
        }
    
        /**
         * 保存或更新properties文件中的key
         * 
         * @param fileName
         * @param key
         * @param value
         */
        public static void saveOrUpdateProperty(String fileName, String key, String value) {
            Properties properties = new Properties();
            InputStream inputStream;
            OutputStream outputStream;
            try {
                String path = ResourcesUtil.class.getClassLoader().getResource(fileName).getPath();
                log.debug("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
                properties.setProperty(key, value);
    
                // 保存到文件中(如果有的话会自动更新,没有会创建)
                outputStream = new FileOutputStream(new File(path));
                properties.store(outputStream, "");
    
                outputStream.close();
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
        }
    
        /**
         * 获取Properties
         * 
         * @param fileName
         * @param key
         * @return
         */
        public static String getPropertyValue(String fileName, String key) {
            Properties properties = new Properties();
            InputStream inputStream;
            String value = "";
            try {
                String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
    
                value = properties.getProperty(key);
                // 保存到文件中(如果有的话会自动更新,没有会创建)
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return value;
        }
    
        /**
         * 获取Properties
         * 
         * @param fileName
         * @return
         */
        public static Properties getProperties(String fileName) {
            Properties properties = new Properties();
            InputStream inputStream;
            try {
                String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
    
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return properties;
        }
    
        /**
         * 获取Properties
         * 
         * @param fileName
         * @return
         */
        public static Properties removeProperty(String fileName, String key) {
            Properties properties = new Properties();
            InputStream inputStream;
            OutputStream outputStream;
            try {
                String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
                log.info("properties -> {}", properties);
                if (properties != null && properties.containsKey(key)) {
                    log.info("remove key:{}", key);
                    properties.remove(key);
                }
    
                // 保存到文件中(将properties保存到文件)
                outputStream = new FileOutputStream(new File(path));
                properties.store(outputStream, "");
    
                outputStream.close();
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return properties;
        }
    
        public static void main(String[] args) {
            // 保存三个 最后一个相当于更新
            PropertiesFileUtils.saveOrUpdateProperty("settings.properties", "a", "aaa");
            PropertiesFileUtils.saveOrUpdateProperty("settings.properties", "b", "bbb");
            PropertiesFileUtils.saveOrUpdateProperty("settings.properties", "c", "ccc");
            PropertiesFileUtils.saveOrUpdateProperty("settings.properties", "a", "AAA");
    
            // 获取所有的properties
            Properties properties = PropertiesFileUtils.getProperties("settings.properties");
            System.out.println(properties);
    
            // 删除a
            PropertiesFileUtils.removeProperty("settings.properties", "a");
    
            // 获取所有的properties
            Properties properties1 = PropertiesFileUtils.getProperties("settings.properties");
            System.out.println(properties1);
        }
    
    }

    结果:

    {b=bbb, a=AAA, c=ccc}
    {b=bbb, c=ccc}

    解释:

    Properties是继承了HashTable的一个普通类,所以我们可以简单的认为操作Properties就是在操作HashTable。

    public
    class Properties extends Hashtable<Object,Object> {
    
         private static final long serialVersionUID = 4112578634029874840L;
    
        protected Properties defaults;
    。。。
    }

     由于HasTable键不可以重复,所以我们在saveOrUpdateProperty中直接setProperty的时候如果没有key会创建key,如果key存在会覆盖原来的值。

      properties.load(inputStream);是将properties文件中的key=value的数据加载到properties中;

      properties.store(outputStream, "");是将properties保存到一个文件中。

    补充:上面代码还可以进一步将properties文件的位置封装全路径:

    package cn.xm.exam.utils;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Properties;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 
     * @author QiaoLiQiang
     * @time 2018年11月3日下午12:05:32
     */
    public class PropertiesFileUtils {
        private static final Logger log = LoggerFactory.getLogger(PropertiesFileUtils.class);
    
        /**
         * 构造函数私有化
         */
        private PropertiesFileUtils() {
    
        }
    
        /**
         * 保存或更新properties文件中的key
         * 
         * @param fileName
         * @param key
         * @param value
         */
        public static void saveOrUpdateProperty(String fileName, String key, String value) {
            Properties properties = new Properties();
            InputStream inputStream;
            OutputStream outputStream;
            try {
                String path = ResourcesUtil.class.getClassLoader().getResource(fileName).getPath();
                log.debug("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
                properties.setProperty(key, value);
    
                // 保存到文件中(如果有的话会自动更新,没有会创建)
                outputStream = new FileOutputStream(new File(path));
                properties.store(outputStream, "");
    
                outputStream.close();
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
        }
    
        /**
         * 获取Properties
         * 
         * @param fileName
         * @param key
         * @return
         */
        public static String getPropertyValue(String fileName, String key) {
            Properties properties = new Properties();
            InputStream inputStream;
            String value = "";
            try {
                String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
    
                value = properties.getProperty(key);
                // 保存到文件中(如果有的话会自动更新,没有会创建)
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return value;
        }
    
        /**
         * 获取Properties
         * 
         * @param fileName
         * @return
         */
        public static Properties getProperties(String fileName) {
            Properties properties = new Properties();
            InputStream inputStream;
            try {
                String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
    
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return properties;
        }
    
        /**
         * 获取Properties
         * 
         * @param fileName
         * @return
         */
        public static Properties removeProperty(String fileName, String key) {
            Properties properties = new Properties();
            InputStream inputStream;
            OutputStream outputStream;
            try {
                String path = PropertiesFileUtils.class.getClassLoader().getResource(fileName).getPath();
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
                log.info("properties -> {}", properties);
                if (properties != null && properties.containsKey(key)) {
                    log.info("remove key:{}", key);
                    properties.remove(key);
                }
    
                // 保存到文件中(将properties保存到文件)
                outputStream = new FileOutputStream(new File(path));
                properties.store(outputStream, "");
    
                outputStream.close();
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return properties;
        }
    
        /**
         * 保存或更新properties文件中的key
         * 
         * @param path
         *            文件全路径
         * @param key
         * @param value
         */
        public static void saveOrUpdatePropertyByFilePath(String path, String key, String value) {
            Properties properties = new Properties();
            InputStream inputStream;
            OutputStream outputStream;
            try {
                log.debug("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
                properties.setProperty(key, value);
    
                // 保存到文件中(如果有的话会自动更新,没有会创建)
                outputStream = new FileOutputStream(new File(path));
                properties.store(outputStream, "");
    
                outputStream.close();
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
        }
    
        /**
         * 获取Properties
         * 
         * @param path
         *            文件全路径
         * @param key
         * @return
         */
        public static String getPropertyValueByFilePath(String path, String key) {
            Properties properties = new Properties();
            InputStream inputStream;
            String value = "";
            try {
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
    
                value = properties.getProperty(key);
                // 保存到文件中(如果有的话会自动更新,没有会创建)
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return value;
        }
    
        /**
         * 获取Properties
         * 
         * @param path
         *            文件全路径
         * @return
         */
        public static Properties getPropertiesByFilePath(String path) {
            Properties properties = new Properties();
            InputStream inputStream;
            try {
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
    
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return properties;
        }
    
        /**
         * 获取Properties
         * 
         * @param path
         *            文件全路径
         * @param key
         *            key值
         * @return
         */
        public static Properties removePropertyByFilePath(String path, String key) {
            Properties properties = new Properties();
            InputStream inputStream;
            OutputStream outputStream;
            try {
                log.info("path -> {}", path);
                inputStream = new FileInputStream(new File(path));
                properties.load(inputStream);
                log.info("properties -> {}", properties);
                if (properties != null && properties.containsKey(key)) {
                    log.info("remove key:{}", key);
                    properties.remove(key);
                }
    
                // 保存到文件中(将properties保存到文件)
                outputStream = new FileOutputStream(new File(path));
                properties.store(outputStream, "");
    
                outputStream.close();
                inputStream.close();
            } catch (FileNotFoundException e) {
                log.error("saveOrUpdateProperty error", e);
            } catch (IOException e) {
                log.error("saveOrUpdateProperty error", e);
            }
            return properties;
        }
    }

    补充:如果是spring项目读取jar包中的配置可以用 ClassPathResource 进行读取:

        /**
         * 获取文件中对应的key的名称
         * 
         * @param fileName
         * @param key
         * @return
         */
        public static String getPropertyValue(String fileName, String key) {
            Properties properties = new Properties();
            InputStream inputStream = null;
            String value = "";
    
            try {
                ClassPathResource resource = new ClassPathResource(fileName);
                inputStream = resource.getInputStream();
                properties.load(inputStream);
                value = properties.getProperty(key);
            } catch (Exception e) {
                log.error("saveOrUpdateProperty error", e);
            } finally {
                IOUtils.closeQuietly(inputStream);
            }
    
            return value;
        }

    补充:由于springboot打成jar包之后里面的文件不能实时修改,所以在当前程序的主目录下创建一settings.properties文件进行操作

    package cn.qs.utils.system;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Date;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.commons.lang3.SystemUtils;
    import org.apache.commons.lang3.time.DateFormatUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import cn.qs.bean.user.User;
    import cn.qs.utils.UUIDUtils;
    import cn.qs.utils.file.PropertiesFileUtils;
    
    public class MySystemUtils {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(MySystemUtils.class);
    
        static {
            checkSettingPropertyFiles();
        }
    
        private MySystemUtils() {
        }
    
        /**
         * 检查settings.properties文件是否存在,不存在就创建
         */
        public static void checkSettingPropertyFiles() {
            File userDir = SystemUtils.getUserDir();
            File propertiesFile = new File(userDir, "settings.properties");
            if (!propertiesFile.exists()) {
                try {
                    propertiesFile.createNewFile();
                    LOGGER.info("create settings.properties success, path: {}", propertiesFile.getAbsolutePath());
                } catch (IOException e) {
                    LOGGER.error("create settings.properties failed", e);
                }
            }
        }
    
        public static final String settings_file_path = SystemUtils.getUserDir().getAbsolutePath() + "/settings.properties";
    
        public static String getProductName() {
            return getProperty("productName", "管理网");
        }
    
        public static String getProperty(String key) {
            return getProperty(key, "");
        }
    
        public static String getProperty(String key, String defaultValue) {
            return StringUtils.defaultIfBlank(PropertiesFileUtils.getPropertyValueByFilePath(settings_file_path, key),
                    defaultValue);
        }
    
        public static void setProperty(String key, Object value) {
            PropertiesFileUtils.saveOrUpdatePropertyByFilePath(settings_file_path, key, String.valueOf(value));
        }
    
    }

      SystemUtils.getUserDir()方法获取的是项目所在的路径,如果是springboot打的jar包是jar包所在的目录。

  • 相关阅读:
    CEPH篇 目录
    kubernetes篇 容器用户权限控制
    深度学习篇-如何理解置信区间
    Mac软件安装篇 for Mac
    JAVA进阶篇 内存模型
    负载均衡篇 不同层次的负载均衡(2/3/4/7)
    NETTY篇 一篇文章看懂NETTY
    base64加密后无法解密
    Spring-Cloud-Gateway 从升级到放弃
    spring gateway 截取response 长度缺失
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/9901797.html
Copyright © 2011-2022 走看看