有时候我们希望处理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包所在的目录。

 

【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】