一.起因
项目需要读取配置文件里面的相关信息,但这相关信息又每隔一段时间会改变。按照正常的逻辑,既然如此那么就将配置文件的信息做成一个表,入库。这样修改起来也方便;但是,如果采用读取数据库的方法,由于公司开发框架的原因,又过于麻烦。但如果使用原来的读取properties配置文件的方法,每次更改配置文件都要重启。。。。。于是脑子里闪过了一个骚操作——能否来波动态修改,就像平时用eclipse一样。。。。然后果然有(感谢强大的百度)。具体方法如下:
二.方法介绍
- 先找到编译以后,properties的路径,也就是系统在运行时,真正被读取的properties路径。避免变成了你在eclipse中时的路径。一般的正确路是在classes目录下,也就是和class文件时同个顶级目录。
- 然后通过动态加载prop.load();
- 得到文件的绝对路径,动态修改Properties文件。使用的时RandomAccessFile 类,该类主要针对新增数据。(针对修改的的话,可以通过字节流的方法,具体可见下面方法)
-
由定义可以看出,该类的主要是通过指针的方法随机访问。这个类有个好处就是能够快速定位到你要修改了位置,因为是通过指针的方法,所以可以实现所谓的“零内存追加”。也就是说,不像其他读取流在实现“在文件最后插入xxx文字”功能时,要将原来文件中所有的内容都读出来,然后再加上xxx文字,最后并写入文档——这样会耗内存。
-
具体方法
-
读取配置文件
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();
}
}
}