Java实现的properties文件动态修改并自动保存工具类

我会详细讲解“Java实现的properties文件动态修改并自动保存工具类”的完整攻略,包括实现细节和示例。

什么是properties文件?

在Java语言中,Properties类是一种用于表示一组持久性属性的集合的取消息类。在程序中,常常需要读取一些配置信息,比如数据库连接字符串、账号密码等信息,这些信息被经常被存储在一个文本文件中,这个文本文件的格式就是properties文件。properties文件中存储着如下格式的信息:

#配置文件示例
db.url=jdbc:mysql://localhost:3306/test
db.username=root
db.password=12345

实现思路

实现一个能够动态修改properties文件并自动保存的工具类的过程如下:

  1. 加载properties文件:使用Properties类的load方法读取properties文件。
  2. 修改properties文件:使用Properties类的setProperty方法设置新值。
  3. 保存properties文件:使用Properties类的store方法将修改后的properties文件保存在硬盘上。

实现细节

  1. 加载properties文件:使用Properties类的load方法读取properties文件。
//加载properties文件
Properties prop = new Properties();
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
prop.load(inputStream);
  1. 修改properties文件:使用Properties类的setProperty方法设置新值。
//修改properties文件
prop.setProperty("db.url", "jdbc:mysql://localhost:3306/test_modify");
  1. 保存properties文件:使用Properties类的store方法将修改后的properties文件保存在硬盘上。
//保存properties文件
OutputStream outputStream = new FileOutputStream("config.properties");
prop.store(outputStream, "update property");
  1. 为了能够动态修改properties文件并自动保存。可以使用Java中的NIO(New IO)技术监听文件修改事件,用线程池实现异步保存属性自动化到磁盘。

示例1

下面的示例代码展示了如何打开config.properties文件,修改属性内容并保存更改。

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

public class PropertiesTool {

    private Properties prop = new Properties();
    private String propFilePath = "config.properties";
    private Long lastModifed;

    public PropertiesTool() {
        super();
        try {
            initProperties();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initProperties() throws Exception {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(propFilePath);
        prop.load(inputStream);

        lastModifed = PropertiesTool.class.getResource(propFilePath).openConnection().getLastModified();
        //开启自动保存线程
        new Thread(new AutoSave(), "PropertiesToolAutoSaveThread").start();
    }

    public void updateProperty(String name, String value) {
        prop.setProperty(name, value);
    }

    public String getProperty(String name) {
        return prop.getProperty(name);
    }

    class AutoSave implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    Thread.sleep(1000);
                    Long nowModifed = PropertiesTool.class.getResource(propFilePath).openConnection().getLastModified();
                    if (nowModifed > lastModifed) {
                        OutputStream outputStream = new FileOutputStream(PropertiesTool.class.getResource(propFilePath).getFile());
                        prop.store(outputStream, "update property");
                        lastModifed = nowModifed;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            PropertiesTool tool = new PropertiesTool();

            //输出修改前的内容
            System.out.println(tool.getProperty("db.url"));

            //修改属性值
            tool.updateProperty("db.url", "jdbc:mysql://localhost:3306/test_modify");

            //属性值修改后对应的配置文件自动保存
            System.out.println(tool.getProperty("db.url"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

示例2

下面的示例代码展示了如何监听config.properties文件内容修改事件,并在修改后自动保存修改后的属性到配置文件。

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.*;
import java.util.Properties;
import java.util.concurrent.Executors;

public class PropertiesTool {

    private Properties prop = new Properties();
    private String propFilePath = "config.properties";
    private Long lastModifed;

    public PropertiesTool() {
        super();
        try {
            initProperties();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initProperties() throws Exception {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(propFilePath);
        prop.load(inputStream);

        lastModifed = PropertiesTool.class.getResource(propFilePath).openConnection().getLastModified();
        //开启自动保存线程
        Executors.newSingleThreadExecutor().execute(new AutoSave());
        //添加属性更新监听器
        Path path = Paths.get(this.getClass().getResource(propFilePath).toURI());
        WatchService watchService = FileSystems.getDefault().newWatchService();
        path.getParent().register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
        Executors.newSingleThreadExecutor().execute(new WatchRunnable(watchService));
    }

    public void updateProperty(String name, String value) {
        prop.setProperty(name, value);
    }

    public String getProperty(String name) {
        return prop.getProperty(name);
    }

    class AutoSave implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    Thread.sleep(1000);
                    Long nowModifed = PropertiesTool.class.getResource(propFilePath).openConnection().getLastModified();
                    if (nowModifed > lastModifed) {
                        OutputStream outputStream = new FileOutputStream(PropertiesTool.class.getResource(propFilePath).getFile());
                        prop.store(outputStream, "update property");
                        lastModifed = nowModifed;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    class WatchRunnable implements Runnable {
        private WatchService watchService;

        public WatchRunnable(WatchService watchService) {
            this.watchService = watchService;
        }

        @Override
        public void run() {
            try {
                while (true) {
                    WatchKey watchKey = watchService.take();
                    for (WatchEvent event : watchKey.pollEvents()) {
                        if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY &&
                                event.context().toString().equals(propFilePath)) {
                            System.out.println("detect properties file changed...");
                            reload();
                            break;
                        }
                    }
                    watchKey.reset();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void reload() throws Exception {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(propFilePath);
        prop.load(inputStream);
    }

    public static void main(String[] args) {
        try {
            PropertiesTool tool = new PropertiesTool();

            //等待监听线程启动
            Thread.sleep(1000);

            //输出修改前的内容
            System.out.println(tool.getProperty("db.url"));

            //修改属性值
            tool.updateProperty("db.url", "jdbc:mysql://localhost:3306/test_modify");

            //属性值修改后对应的配置文件自动保存
            System.out.println(tool.getProperty("db.url"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

总结

通过这个工具类的实现,我们可以实现某些需要动态修改配置文件的功能,而且能够自动保存修改后的值到配置文件中,大大提高了程序的健壮性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现的properties文件动态修改并自动保存工具类 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java练手项目(尚硅谷的),不涉及框架,数据库等。

    软件:idea我是先建立了一个空白的项目,自己创建的src包和其下面的包。问题一:建立包之后发现格式为src.com.tjp.bean 没办法建立其他与bean同级的service test utils view 等。只允许继续建立bean的子包。解决: 这是因为idea自动会折叠空白包。(不同版本的idea可能和我的位置不太一样,但是都在那个齿轮里,第一步…

    Java 2023年5月4日
    00
  • jQuery解析json数据实例分析

    下面将为您介绍如何使用 jQuery 解析 JSON 数据。 解析 JSON 数据的方法 使用 jQuery 的 $.parseJSON() 方法 通过使用 jQuery 的 $.parseJSON() 方法可以将字符串形式的 JSON 数据转化为 JavaScript 对象。 var jsonData = ‘{"name":"…

    Java 2023年6月15日
    00
  • SpringBoot 使用@WebMvcTest测试MVC Web Controller

    SpringBoot 使用 @WebMvcTest 测试 MVC Web Controller 在 SpringBoot 中,我们可以使用 @WebMvcTest 注解来测试 MVC Web Controller。@WebMvcTest 注解提供了一种简单的方式来测试 Spring MVC 控制器,而不需要启动完整的应用程序上下文。本文将详细讲解 Sprin…

    Java 2023年5月18日
    00
  • Hibernate的各种保存方式的区别详解

    下面是关于Hibernate的各种保存方式的区别详解的完整攻略。 Hibernate的各种保存方式 在Hibernate中,有四种保存方式,分别是:- save()方法- persist()方法- saveOrUpdate()方法- merge()方法 下面将详细介绍它们之间的区别。 save()方法 在Hibernate中,通过save()方法保存一个持久…

    Java 2023年5月19日
    00
  • Java连接 JDBC基础知识(操作数据库:增删改查)

    Java连接 JDBC基础知识(操作数据库:增删改查) 前言 在现代的 Web 开发中,数据库是一个非常重要的组成部分。而 Java 作为一种高度优秀的编程语言,有着丰富的数据库连接库和框架。其中,JDBC 就是 Java 数据库连接的一种基础技术,而其实现也是非常简单的。本文将介绍 JDBC 基础知识及其在操作数据库时的使用攻略。 JDBC 连接数据库 首…

    Java 2023年5月19日
    00
  • Java及数据库对日期进行格式化方式

    Java及数据库对日期进行格式化方式的完整攻略: Java中日期格式化的步骤: 定义日期格式化字符串:通过SimpleDateFormat类的构造函数来定义日期格式化字符串。例如,”yyyy-MM-dd HH:mm:ss”表示的是年-月-日 时:分:秒的格式。其中,字母y代表年份,M代表月份,d代表日期,H代表24小时制的小时数,m代表分钟数,s代表秒数。 …

    Java 2023年5月20日
    00
  • 浅谈SpringBoot项目打成war和jar的区别

    一、Spring Boot打为war包和jar包的区别 在Spring Boot的项目中,我们有两种打包方式,一个是打成war包,一个是打成jar包。两者的主要区别是在于部署方式方面。 1、打成war包 war包是一种WEB应用程序归档文件,其包含了Web应用程序的完整内容,包括jsp、servlet、html、javascript、css等静态资源以及ja…

    Java 2023年5月19日
    00
  • JSP过滤器防止Xss漏洞的实现方法(分享)

    实现JSP过滤器来防止XSS漏洞的方法如下: 在web.xml文件中添加过滤器配置 在web.xml文件中添加以下过滤器配置: <filter> <filter-name>XssFilter</filter-name> <filter-class>com.example.XssFilter</filter…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部