`

动态修改properties配置文件

 
阅读更多

在实际的项目中有些数据是临时数据不必要保存到数据库中因此保存到properties配置文件中也是不错的选择。

但是保存在文件中的弊端就是如果要修改就需要修改配置文件了,做成可视化的配置界面有点偏移主题了。

以下代码参考的log4j-x-x.jar中的文件并做少许更改。

具体代码程序实现:扫描文件类FileWatchdog.java

 

import java.io.File;

/**
 Check every now and then that a certain file has not changed. If it
 has, then call the {@link #doOnChange} method.
 @author Ceki Gülcü
 @since version 0.9.1 
 @update zhangyq 
 @date 2014-4-28 10:54:00
 */
public abstract class FileWatchdog extends Thread {

	/**
	   The default delay between every file modification check, set to 60
	   seconds.  */
	static final public long DEFAULT_DELAY = 60000;
	/**
	   The name of the file to observe  for changes.
	 */
	protected String filename;

	/**
	   The delay to observe between every check. By default set {@link
	   #DEFAULT_DELAY}. */
	protected long delay = DEFAULT_DELAY;

	File file;
	long lastModif = 0;
	boolean warnedAlready = false;
	boolean interrupted = false;

	protected FileWatchdog(String filename) {
		this.filename = filename;
		file = new File(filename);
		setDaemon(true);
		checkAndConfigure();
	}

	/**
	   Set the delay to observe between each check of the file changes.
	 */
	public void setDelay(long delay) {
		this.delay = delay;
	}

	abstract protected void doOnChange();

	protected void checkAndConfigure() {
		boolean fileExists;
		try {
			fileExists = file.exists();
		} catch (SecurityException e) {
			interrupted = true; // there is no point in continuing
			return;
		}

		if (fileExists) {
			long l = file.lastModified(); // this can also throw a SecurityException
			if (l > lastModif) { // however, if we reached this point this
				lastModif = l; // is very unlikely.
				doOnChange();
				warnedAlready = false;
			}
		} else {
			if (!warnedAlready) {
				warnedAlready = true;
			}
		}
	}

	public void run() {
		while (!interrupted) {
			try {
				Thread.sleep(delay);
			} catch (InterruptedException e) {
				// no interruption expected
			}
			checkAndConfigure();
		}
	}
}

 该类监测是否修改并提供一个抽象方法

abstract protected void doOnChange();

在文件修改后要做的下一步操作。

具体的业务需求是:将配置文件中的数据保存到一个Map<String,String>集合中一旦修改了该配置文件集合中的数据同时也做修改,具体代码实现:

/**
 * Info: 动态加载*.properties文件
 * Date: 2014-4-28 14:22:54
 * @author zhangyq
 * 
 */
public class PropertiesFileDynamicLoadingUtil {
	
	  private  static Map<String, String>  fileProperty;
	  
	  public static Map<String, String> getFileProperty() {
			return fileProperty;
	  }

	  /**
	   * 
	   * @param configFilename		文件的绝对路径
	   * @param delay				检验文件的间隔时间段
	   */
	  public static void configureAndLoad(String configFilename, long delay) {
		  
		PropertyWatchdog pdog = new PropertyWatchdog(configFilename);
		pdog.setDelay(delay);
		pdog.start();
		
	  }
	  
	 
//-------------------------------------- 静态内部类定义 --------------------------		
	 /**
	  * Info:		动态读取配置文件的信息
	  * @author 		zhangyq
	  */
	 static class PropertyWatchdog extends FileWatchdog {
	 	
		/**
		 * 加载配置文件
		 * @param props
		 * @return
		 */
	 	public static Map<String, String> loadProperites(Properties props){
	 		
	 		 fileProperty = new HashMap<String, String>();
	 		
	 		 Set<Entry<Object, Object>> entrySet = props.entrySet();
	 		 
	         for (Entry<Object, Object> entry : entrySet) {
	            	 fileProperty.put(((String) entry.getKey()).trim(), ((String) entry.getValue()).trim());
	         }
	         return fileProperty;
	 	}
	 	
	 	/**
	 	 * 构造函数
	 	 * @param configFileName	绝对路径
	 	 */
	 	PropertyWatchdog(String filename){
	 		super(filename);
	 	}
	 	

	 	@Override
	 	protected void doOnChange() {
	 		Properties props = new Properties();
	 	    FileInputStream istream = null;
	 	    try {
	 	      istream = new FileInputStream(filename);
	 	      props.load(istream);
	 	      istream.close();
	 	    }
	 	    catch (Exception e) {
	 	      return;
	 	    } finally {
	 	        if(istream != null) {
	 	            try {
	 	                istream.close();
	 	            } catch(Throwable ignore) {
	 	            	
	 	            }
	 	
	 	        }
	 	    }
	 	    // TODO 
	 	   loadProperites(props);
	 		
	 	}

	 }
//--------------------------------------end 静态内部类定义 end--------------------------
}

 具体测试和正式调用代码为:path参数为绝对路径

PropertiesFileDynamicLoading.configureAndLoad(path, 15);
		
Map<String, String>  map = PropertiesFileDynamicLoading.getFileProperty();

 

 

 

分享到:
评论

相关推荐

    java 动态修改配置文件

    本文将深入探讨如何在Java中实现动态修改配置文件,同时解决中文字符编码问题,使得配置文件的读写更加高效和便捷。 首先,我们需要理解Java中的Properties类,它是处理配置文件的标准工具。`java.util.Properties`...

    java 动态修改Properties,src下或者指定路径

    在Java编程中,有时我们需要在运行时动态地修改配置文件,比如Properties文件。Properties文件是Java用来存储配置信息的一种常见方式,通常包含了应用的各种参数设置。然而,一旦将应用程序打包成JAR,内部的资源...

    Python实现读取Properties配置文件的方法

    在Python编程中,有时我们需要处理Java开发中常用的`.properties`配置文件。虽然Python标准库并未直接提供处理此类文件的模块,但我们可以自定义一个类来实现这个功能。本篇文章将详细探讨如何通过Python来读取并...

    c#操作properties,读写配置文件

    这些配置信息通常存储在配置文件中,便于程序运行时动态加载和修改。C#提供了一种简单有效的方法来操作配置文件中的属性(Properties),即通过`System.Configuration`命名空间下的`ConfigurationManager`类以及`...

    java读取properties配置文件

    在Java编程中,`properties`文件是一种常用的存储配置信息的方式,它以键值对的形式组织数据,便于程序在运行时动态获取和修改配置。本文将详细介绍如何在Java中读取`properties`配置文件。 首先,我们需要了解`...

    .properties配置文件操作(增删改)

    本文将深入探讨如何进行`.properties`配置文件的操作,包括增加、删除和修改其内容。 首先,`.properties`文件的格式非常简单,由一系列键值对组成,每行一个键值对,键和值之间用等号(`=`)或冒号(`:`)分隔。例如:...

    Configuration对properties、xml配置文件的【增删改查】及动态加载

    二、Properties配置文件处理 1. **读取Properties文件** 使用`PropertiesConfiguration`类可以方便地读取.properties文件。通过指定文件路径,我们可以创建一个配置实例,然后通过键值对的方式获取配置项。 2. **...

    java对properties配置文件的读和写

    修改properties配置文件** 1.3.1 先读取文件,然后修改键值对:与读取类似,先加载文件内容,然后使用`setProperty()`更新或添加新的键值对。 ```java properties.setProperty("name", "李四"); properties.set...

    java修改Properties文件,让输出格式与输入格式保持不变

    这篇博客“java修改Properties文件,让输出格式与输入格式保持不变”就探讨了如何解决这个问题。 首先,我们需要理解Java Properties类的默认行为。Properties类在加载和保存文件时,会按照一定的规则进行格式化,如...

    log4j.jar包,和log4j.properties配置文件下载

    以下是一些`log4j.properties`配置文件中的关键元素: - `appender`: 定义日志输出的目标,如`ConsoleAppender`(控制台)、`FileAppender`(文件)或`SMTPAppender`(电子邮件)。 - `layout`: 指定日志输出的...

    nacos 配置文件 application.properties

    nacos-server-2.4.1配置文件详细配置

    读取properties配置文件所用jar

    本主题将深入探讨如何使用特定的jar包来读取这些properties配置文件,以及涉及到的相关技术和库。 标题提及的"读取properties配置文件所用jar"主要指的是Apache Commons Configuration库,这是一个强大的Java库,它...

    读取properties配置文件

    4. **缓存与更新**:为了提高性能,`PropertiesUtil`可能会缓存加载的配置文件,但这也意味着在配置文件被修改后,程序可能不会立即看到更新。因此,需要考虑如何在配置文件更改时刷新缓存。 5. **多环境支持**:在...

    java 改变Properties文件中的键值

    `Java.jpg`可能是一个与Java编程相关的图像,可能用于教程或说明,但在这个上下文中,它与修改Properties文件的操作没有直接关系。 总结来说,Java中修改Properties文件的键值涉及到使用`Properties`类的`load()`,...

    利用Java的Properties 类读取配置文件信息

    通过以上步骤,你可以使用Java的`Properties`类高效地读取、修改和保存配置文件,为你的应用程序提供灵活的配置管理。在实际项目中,你可能会将其封装到一个单独的类,如示例代码中的`PropertiesReader`,以提供更...

    读取以及修改properties文件

    本篇将深入探讨如何读取和修改Properties文件,以帮助开发者更好地管理程序的配置。 1. **读取Properties文件** - 使用`java.util.Properties`类:这是Java提供的标准类,用于处理Properties文件。首先,我们需要...

    Hibernate配置文件加载后修改配置信息

    在Java开发过程中,特别是在使用ORM框架如Hibernate时,开发者经常需要对配置文件中的数据库连接信息进行动态修改或加密处理。本文将详细介绍如何利用反射机制来修改已经加载到内存中的`hibernate.cfg.xml`配置文件...

    java配置文件修改读取工具类,包括yml和properties类型文件

    总结来说,`YmlUtil.java`和`PropertiesUtil.java`是Java开发中的实用工具类,它们简化了YAML和Properties配置文件的读取和修改过程,提高了代码的可维护性和灵活性。理解和使用这些工具类,对于提升Java项目管理...

    能保存Properties文件注释的Properties工具类

    在Java编程中,Properties类是用于处理属性列表的,这些属性列表通常以键值对的形式存储,例如配置文件。然而,标准的java.util.Properties类在加载和保存文件时会忽略注释,这在某些场景下可能不够理想。针对这个...

Global site tag (gtag.js) - Google Analytics