动态修改Properties配置文件,避免每次修改都要重启系统

一.起因

    项目需要读取配置文件里面的相关信息,但这相关信息又每隔一段时间会改变。按照正常的逻辑,既然如此那么就将配置文件的信息做成一个表,入库。这样修改起来也方便;但是,如果采用读取数据库的方法,由于公司开发框架的原因,又过于麻烦。但如果使用原来的读取properties配置文件的方法,每次更改配置文件都要重启。。。。。于是脑子里闪过了一个骚操作——能否来波动态修改,就像平时用eclipse一样。。。。然后果然有(感谢强大的百度)。具体方法如下:

二.方法介绍

  1. 先找到编译以后,properties的路径,也就是系统在运行时,真正被读取的properties路径。避免变成了你在eclipse中时的路径。一般的正确路是在classes目录下,也就是和class文件时同个顶级目录。
  2. 然后通过动态加载prop.load();
  3. 得到文件的绝对路径,动态修改Properties文件。使用的时RandomAccessFile 类,该类主要针对新增数据。(针对修改的的话,可以通过字节流的方法,具体可见下面方法
  4. 由定义可以看出,该类的主要是通过指针的方法随机访问。这个类有个好处就是能够快速定位到你要修改了位置,因为是通过指针的方法,所以可以实现所谓的“零内存追加”。也就是说,不像其他读取流在实现“在文件最后插入xxx文字”功能时,要将原来文件中所有的内容都读出来,然后再加上xxx文字,最后并写入文档——这样会耗内存。

  5. 具体方法

  6. 读取配置文件

    public static void readProperties() {
    		Properties props = new Properties();
    		InputStream fis = Createxsxl.class
    				.getResourceAsStream("/test.properties");
    		try {
    			props.load(fis);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		String name = props.getProperty(key);
    		System.out.println(name);
    	}

    7.动态修改(路径必须时properties文件的绝对路径),这里讲两个方法:第一个是追加文件内容,第二个是修改文件内容

    /**
    	 * 添加配置文件信息
    	 * 
    	 * @param filePath
    	 * @param content
    	 */
    	public static void addMessageFile(String filePath, String content) {
    		RandomAccessFile raf = null;
    		try {
    			raf = new RandomAccessFile(filePath, "rw");
    			raf.seek(raf.length());
    			raf.write(content.getBytes());
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    			try {
    				raf.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    
    	}
    public void main(String key,String value,String filepath){
        Properties pro = new Properties();
        try{
            InputStream in = null;
            in = new BufferedInputStream(new FileInputStream(filepath));
            pro.load(in);
            FileOutputStream file = new FileOutputSream(filepath);
            pro.put(key,value);
            pro.store(file,"这次更新的备注");
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                in.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }

    顺便给个读取绝对路径的方法

    String filepath = PropertiesUtil.class.getClassLoader()
    			.getResource(“/test.properties”).getPath();

    三.扩展

作为一个习惯吧,每次修改文件以后最后将原来的文件进行一个备份处理,防止修改错误带来的损失。(本质就是文件的复制,可以选取自己喜欢的方法)

public static void BackUpFile(String srcPathStr, String desPathStr) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(srcPathStr);
			fos = new FileOutputStream(desPathStr);

			byte datas[] = new byte[1024 * 8];

			int len = 0;

			while ((len = fis.read(datas)) != -1) {
				fos.write(datas, 0, len);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {

			try {
				fis.close();
				fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值