最近在弄取一个值,因为只是一个值,感觉放到数据库中有些麻烦,其实也没有多麻烦,无非就是创建一张表,然后存储数据。但是我感觉因为一个值,还又创建表,没有必要。所以就想到了放在properties文件。因为不太熟悉这个,所以上网查了很多。代码其实都差不多,都是一个意思。我感觉最主要的是properties文件的地址。很多写博客的都是直接path带过,他妹的,老子要是知道完整地址的话,用你干哈啊。这就是让人很生气的。再有就是,没有说的很详细。一知半解的。我也是看了自己的项目,然后找到properties文件才知道哪跟哪的。
下面的是工具类
import org.apache.logging.log4j.util.PropertiesUtil;
import org.springframework.beans.factory.annotation.Value;
import java.io.*;
import java.util.Properties;
public class IoUtil {
private static String path = Thread.currentThread().getContextClassLoader().getResource("messages.properties").getPath();
private static Properties prop;
public static void load(String path){
//这里的path是项目文件的绝对路径
//先获取项目绝对路径:Thread.currentThread().getContextClassLoader().getResource("").getPath();
//然后在项目路径后面拼接"properties/sysConfig.properties";
prop= new Properties();// 属性集合对象
FileInputStream fis;
try {
System.out.println(path);
fis = new FileInputStream(path);
prop.load(fis);
fis.close();// 关闭流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//参数为要修改的文件路径 以及要修改的属性名和属性值
public static Boolean updatePro(String path,String key,String value){
if(prop==null){
load(path);
System.out.println("修改前重新加载一遍");
}
System.out.println("获取添加或修改前的属性值:"+key+"=" + prop.getProperty(key));
prop.setProperty(key, value);
// 文件输出流
try {
FileOutputStream fos = new FileOutputStream(path);
// 将Properties集合保存到流中
prop.store(fos, "Copyright (c) Boxcode Studio");
fos.close();// 关闭流
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
System.out.println("获取添加或修改后的属性值:"+key+"=" + prop.getProperty(key));
return true;
}
//参数为要修改的文件路径 以及要修改的属性名和属性值
public static String getPro(String path,String key){
if(prop==null){
load(path);
System.out.println("重新加载一遍");
}
FileInputStream fis;
try {
fis = new FileInputStream(path);
prop.load(fis);// 将属性文件流装载到Properties对象中
fis.close();// 关闭流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("查询到的"+key+"的值:"+prop.getProperty(key));
return prop.getProperty(key);
}
}
地址主要是通过 private static String path =Thread.currentThread().getContextClassLoader().getResource("messages.properties").getPath();
来获取的。
注意事项:
修改的文件是在target文件下的,这个是我的项目target目录。首先在resources下的有这个文件。然后target才会有这个文件。
千万别有人说这个target的文件夹我怎么没有什么之类的,这个你项目没有,自己查啊。注意修改的是target下的这个properties文件,resoureces下的并不会被修改。
有人会问我,那resources下都有properties文件,为什么不直接操作这个呢,因为我只查到了怎么获取,怎么修改我不会,
获取的方法如下:
Properties properties=new Properties();
InputStream in = null;
try {
in = PropertiesUtil.class.getClassLoader().getResourceAsStream("messages.properties");
properties.load(new InputStreamReader(in, "UTF-8"));
address = properties.getProperty("address");
System.out.println(properties.getProperty("address"));
} catch (Exception e) {
System.out.println( "文件未找到!");
e.printStackTrace();
}
return address;
但是修改的话,还是要文件的地址的。
Properties properties=new Properties();
FileOutputStream file = new FileOutputStream(path);
properties.put("address", address);
System.out.println("得到属性key:"+properties.getProperty("address"));
properties.store(file, "系统配置修改");
因为关于这个地址我有点问题。这个项目是要发布到服务器上的,所以先有了一种方法,已经成功了。就没有在纠结。如果看到这篇文章的人,有解决我注意事项下的这个问题的话,记得给我发给评论呗