All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.voovan.tools.TProperties Maven / Gradle / Ivy

There is a newer version: 4.3.8
Show newest version
package org.voovan.tools;

import org.voovan.Global;
import org.voovan.tools.hashwheeltimer.HashWheelTask;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;

/**
 * properties文件操作类
 * 		当properties 文件变更后自动移除缓存内的数据, 下次访问时会重新读取文件内容
 *
 * @author helyho
 *
 * Voovan Framework.
 * WebSite: https://github.com/helyho/Voovan
 * Licence: Apache v2 License
 */
public class TProperties {

	private static ConcurrentHashMap propertiesFile = new ConcurrentHashMap();
	private static ConcurrentHashMap propertiesName = new ConcurrentHashMap();
	private static ConcurrentHashMap propertiesWatcher = new ConcurrentHashMap();

	static {
		Global.getHashWheelTimer().addTask(new HashWheelTask() {
			@Override
			public void run() {
				Iterator> iterator = propertiesWatcher.entrySet().iterator();
				while (iterator.hasNext()) {
					Map.Entry entry = iterator.next();
					File file = entry.getKey();
					long lastWatchTime = entry.getValue();
					long lastFileTime = file.lastModified();
                    if (lastWatchTime != lastFileTime) {
						propertiesFile.remove(file);
						propertiesName.remove(file.getName());
                        iterator.remove();
                    }
				}
			}

		}, 5, true);
	}


	/**
	 * 解析 Properties 文件
	 *
	 * @param file 文件对象
	 * @return Properties 对象
	 */
	public static Properties getProperties(File file) {
		try {
			Properties properties = propertiesFile.get(file);

			if (properties==null) {
				Properties properites = new Properties();
				String content = null;
				if(!file.getPath().contains("!"+File.separator)) {
					content = new String(TFile.loadFile(file));
				}else{
					String filePath = file.getPath();
					String resourcePath = filePath.substring(filePath.indexOf("!"+File.separator)+2, filePath.length());
					content = new String(TFile.loadResource(resourcePath));
				}
				properites.load(new StringReader(content));
				propertiesWatcher.put(file, file.lastModified());
				propertiesFile.put(file, properites);
				System.out.println("[PROPERTIES] Load Properties file: " + file.getPath());
			}

			return propertiesFile.get(file);

		} catch (IOException e) {
			System.out.println("Get properites file failed. File:" + file.getAbsolutePath() + "-->" + e.getMessage());
			return null;
		}
	}

	/**
	 * 解析 Properties 文件
	 *
	 * @param fileName 文件名, 不包含扩展名, 或自动瓶装环境参数和扩展名
	 *                 传入 database 参数会拼装出 database-环境名.properties 作为文件名
	 *                 并且在 classes 或者 target/classes 目录下寻找指定文件.
	 *                 如果没有指定环境名的配置文件则使用默认的配置文件
	 * @return Properties 对象
	 */
	public static Properties getProperties(String fileName) {
		File file = null;
		Properties properties;

        String configFileNameWithEnv = null;
        String configFileName = "";
        if (!fileName.contains(".properties")) {
            String envName = TEnv.getEnvName();

            envName = envName == null ? "" : "-" + envName;

            configFileNameWithEnv = fileName + envName + ".properties";
            configFileName = fileName + ".properties";
        }

        properties = propertiesName.get(configFileNameWithEnv);
        if (properties == null) {
            properties = propertiesName.get(configFileName);
        }

        if(properties==null) {
            File configFile = TFile.getResourceFile(configFileName);
            File configFileWithEnv = TFile.getResourceFile(configFileNameWithEnv);

            if (configFileWithEnv != null) {
                file = configFileWithEnv;
                fileName = configFileNameWithEnv;
            } else if (configFile != null) {
                file = configFile;
				fileName = configFileName;
            }

            if(file!=null) {
                properties = getProperties(file);
                propertiesName.put(fileName, properties);
                return properties;
            } else {
                System.out.println("Get properites file failed. File:" + file.getName());
                return null;
            }
        } else {
            return properties;
        }
	}

	/**
	 * 从Properties文件读取字符串
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static String getString(File file, String name, String defaultValue) {
		Properties properites = getProperties(file);
		String value = properites.getProperty(name);
		return TString.isNullOrEmpty(value) ? defaultValue: value;
	}

	/**
	 * 从Properties文件读取字符串
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static String getString(File file, String name) {
		return getString(file, name, null);
	}

	/**
	 * 从Properties文件读取整形
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static int getInt(File file, String name, Integer defaultValue) {
		defaultValue = defaultValue == null ? 0 : defaultValue;
		String value = getString(file, name);
		return TString.isNullOrEmpty(value) ? defaultValue : Integer.valueOf(value.trim());
	}

	/**
	 * 从Properties文件读取整形
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static int getInt(File file, String name) {
		return getInt(file, name, null);
	}

	/**
	 * 从Properties文件读取浮点数
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static float getFloat(File file, String name, Float defaultValue) {
		defaultValue = defaultValue == null ? 0f : defaultValue;
		String value = getString(file, name);
		return TString.isNullOrEmpty(value) ? defaultValue : Float.valueOf(value.trim());
	}

	/**
	 * 从Properties文件读取浮点数
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static float getFloat(File file, String name) {
		return getFloat(file, name, null);
	}

	/**
	 * 从Properties读取双精度浮点数
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static double getDouble(File file, String name, Double defaultValue) {
		defaultValue = defaultValue == null ? 0d : defaultValue;
		String value = getString(file, name);
		return TString.isNullOrEmpty(value) ? defaultValue : Double.valueOf(value.trim());
	}

	/**
	 * 从Properties读取双精度浮点数
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static double getDouble(File file, String name) {
	    return getDouble(file, name, null);
	}

	/**
	 * 从Properties文件读取 Boolean
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static boolean getBoolean(File file, String name, Boolean defaultValue) {
		defaultValue = defaultValue == null ? false : defaultValue;
		String value = getString(file, name);
		return TString.isNullOrEmpty(value) ? defaultValue : Boolean.valueOf(value.trim());
	}

	/**
	 * 从Properties读取双精度浮点数
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static boolean defaultValue(File file, String name) {
		return getBoolean(file, name, null);
	}

	/**
	 * 保存信息到 Properties文件
	 *
	 * @param file 文件对象
	 * @param name 属性名
	 * @param value 属性值
	 * @throws IOException IO异常
	 */
	public static void setString(File file, String name, String value) throws IOException {
		Properties properites = getProperties(file);
		properites.setProperty(name, value);
		properites.store(new FileOutputStream(file), null);
	}

	//-----------------------------------------------------------------------------


	/**
	 * 从Properties文件读取字符串
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static String getString(String fileName, String name, String defaultValue) {
		Properties properites = getProperties(fileName);
		String value = properites.getProperty(name);
		return TString.isNullOrEmpty(value) ? defaultValue : value;
	}

	/**
	 * 从Properties文件读取字符串
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static String getString(String fileName, String name) {
		return getString(fileName, name, null);
	}

	/**
	 * 从Properties文件读取整形
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static int getInt(String fileName, String name, Integer defaultValue) {
		defaultValue = defaultValue == null ? 0 : defaultValue;
		String value = getString(fileName, name);
		return TString.isNullOrEmpty(value) ? defaultValue : Integer.valueOf(value.trim());
	}

	/**
	 * 从Properties文件读取整形
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static int getInt(String fileName, String name) {
	    return getInt(fileName, name, null);
	}

	/**
	 * 从Properties文件读取浮点数
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static float getFloat(String fileName, String name, Float defaultValue) {
		defaultValue = defaultValue == null ? 0f : defaultValue;
		String value = getString(fileName, name);
		return TString.isNullOrEmpty(value) ? defaultValue : Float.valueOf(value.trim());
	}

	/**
	 * 从Properties文件读取浮点数
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static float getFloat(String fileName, String name) {
		return getFloat(fileName, name, null);
	}

	/**
	 * 从Properties读取双精度浮点数
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static double getDouble(String fileName, String name, Double defaultValue) {
		defaultValue = defaultValue == null ? 0d : defaultValue;
		String value = getString(fileName, name);
		return TString.isNullOrEmpty(value) ? defaultValue : Double.valueOf(value.trim());
	}

	/**
	 * 从Properties读取双精度浮点数
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static double getDouble(String fileName, String name) {
	    return getDouble(fileName, name, null);
	}


	/**
	 * 从Properties文件读取 Boolean
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @param defaultValue 默认值
	 * @return 属性值
	 */
	public static boolean getBoolean(String fileName, String name, Boolean defaultValue) {
		defaultValue = defaultValue == null ? false : defaultValue;
		String value = getString(fileName, name);
		return TString.isNullOrEmpty(value) ? defaultValue : Boolean.valueOf(value.trim());
	}

	/**
	 * 从Properties文件读取 Boolean
	 *
	 * @param fileName 文件对象
	 * @param name 属性名
	 * @return 属性值
	 */
	public static boolean getBoolean(String fileName, String name) {
		return getBoolean(fileName, name, null);
	}

	/**
	 * 清空 Properites 缓存
	 */
	public void clear(){
		propertiesName.clear();
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy