properties文件或类笔记

properties文件

是java所支持的配置文件类型.
java中的properties文件是一种配置文件,
主要用于表达配置信息,
文件类型为*.properties,
格式为文本文件,
在properties文件中,可以用”#”来作注释.

文件的内容是格式是 “键=值”的格式,

properties是配置文件。

主要的作用是通过修改配置文件可以方便地修改代码中的参数,实现不用改class文件即可灵活变更参数。

解释:java运行中java文件会变成class文件,之后无法通过反编译找到原样的代码,这样的话,如果java类中某个参数变更,就很难灵活的实现参数修改,这个时候properties 文件就能很灵活的实现配置,减少代码的维护成本和提高开发效率。

jdbc.properties/database.properties示例:

在SMM项目中,JDBC配置文件用于配置应用程序与数据库之间的连接。
通常,JDBC配置文件中应该包含以下属性:

  1. jdbc.driver: 数据库驱动程序的类名,例如com.mysql.jdbc.Driver。
  2. jdbc.url: 数据库的URL地址,例如jdbc:mysql://localhost:3306/mydatabase。
  3. jdbc.username: 连接数据库所需的用户名。
  4. jdbc.password: 连接数据库所需的密码。
  5. jdbc.initialSize: 连接池初始化时创建的连接数。
  6. jdbc.maxActive: 连接池中最大的活动连接数。
  7. jdbc.maxIdle: 连接池中最大的空闲连接数。
  8. jdbc.minIdle: 连接池中最小的空闲连接数。

以上属性是最常见的JDBC配置属性,当然,还有其他一些属性可以根据具体应用场景进行配置,例如连接超时时间、查询超时时间、验证语句等。

1
2
3
4
5
6
7
driverClassName=com.mysql.cj.jdbc.Driver
#com.mysql.cj.jdbc.Driver为MySQL8.0版本以上
url=jdbc:mysql://localhost:3306/kgc
user=root
password=root
initialSize=5
maxActive=10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
url=jdbc:mysql://localhost:3306/appinfodb?useUnicode=true&amp&characterEncoding=utf-8&zeroDateTimeBehavior=round
driver=com.mysql.jdbc.Driver
#这是JDBC连接字符串,指定了MySQL数据库的地址和要连接的数据库名称。
#com.mysql.jdbc.Driver 为MySQL5.0版本左右
#`useUnicode=true`指定要使用Unicode字符集,
#`characterEncoding=utf-8`指定字符集为UTF-8
#`zeroDateTimeBehavior=round`指定当数据库中的日期时间字段为零时,应将其舍入到最接近的值。
username=root
password=root
minIdle=45
maxIdle=50
initialSize=5
maxActive=100
maxWait=100
removeAbandonedTimeout=180
#这是连接被认为是遗弃的时间,以秒为单位,在这段时间内未被使用的连接将被关闭,这里配置为180秒。
removeAbandoned=true
#这是一个布尔值,指示是否启用连接的遗弃检查。如果设置为true,则连接池将在`removeAbandonedTimeout`时间内检查连接是否被遗弃,如果是,则关闭该连接。

读取properties文件示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static Properties getProperties(String config) throws IOException {
//获取properties文件
Properties properties = new Properties();
InputStreamReader in=null;//输入流
FileInputStream inStream=null ;//文件输入
try {
inStream = new FileInputStream(new File(config));
in = new InputStreamReader(inStream,("UTF-8"));
// 处理中文字符流
properties.load(in);
//加载properties文件
}catch (Exception e) {
log.error("无法找到并使用配置文件: [ " + config+" ]");
}finally {
if (inStream!=null) {
inStream.close();
}
if (in!=null) {
in.close();
}
}
return properties;
}

Properties类

主要用于读取Java的配置文件.
Properties类表示一组持久的属性。
properties属性可以保存到流中或从流中加载。
properties属性列表中的每个键及其对应的值都是一个字符串。
properties属性列表可以包含另一个属性列表作为其“默认值”;
如果在原始属性列表中找不到属性键,则会搜索此第二个属性列表。

方法:
load—加载;
store–存储;
load(Reader)/store(Writer,String)方法以一个简单的面向行的格式从以下格式加载和存储属性到基于字符的流。
load(InputStream)/store(OutputStream,String)方法的工作方式与加载(Reader)/存储(Writer,String)对相同,只是输入/输出流以ISO 8859-1字符编码编码。

Properties 类表示了一个持久的属性集。
Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

一个属性列表可包含另一个属性列表作为它的“默认值”;
如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。

因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。
相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。
类似地,如果在“不安全”的Properties 对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败。

简单用例

-1打印自定义.properties 文件中的值

在src/main/resources 目录下,放置 jdbc.properties 文件,是数据库的配置文件。
![[Pasted image 20230617144233.png]]

1
2
3
4
jdbc.driver=com.mysql.jdbc.Driverjdbc
url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8jdbc
username=root
password=root

list 输出到控制台 用绝对路径加载

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void name1Test(){
try{
Properties properties=new Properties();
//磁盘符的绝对路径
InputStream input=new BufferedInputStream(new FileInputStream("D:\\jdbc.properties"));
properties.load(input);
properties.list(System.out);
}catch(Exception e){
e.printStackTrace();
}
}

-2propertyNames 输出 getClass() 加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void name2Test(){
try{
Properties properties=new Properties();
// 用/文件名, / 表示根目录
InputStream input=PropertiesTest.class.getClass().getResourceAsStream("/jdbc.properties");
properties.load(input);
Enumeration<String> names=(Enumeration<String>) properties.propertyNames();
while(names.hasMoreElements()){
//这是key值
String key=names.nextElement();
String value=properties.getProperty(key);
System.out.println(key+"="+value);
}
}catch(Exception e){
e.printStackTrace();
}
}

-3stringPropertyNames 输出 getClassLoader 加载 (推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void name3Test(){
try{
Properties properties=new Properties();
//直接写src 类路径下的文件名
InputStream input=PropertiesTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(input);
//把key值转换成set 的形式,遍历set
Set<String> names=properties.stringPropertyNames(); Iterator<String> iterator=names.iterator();
while(iterator.hasNext()){
String key=iterator.next();
String value=properties.getProperty(key);
System.out.println(key+"="+value);
}
}catch(Exception e){
e.printStackTrace();
}
}

-4获取值 getProperties

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void name3Test(){
try{
Properties properties=new Properties();
InputStream input=PropertiesTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(input);
//String value=properties.getProperty("jdbc.url");
String value=properties.getProperty("jdbc.url1","没有该key值");
System.out.println("输出值:"+value);
}catch(Exception e){
e.printStackTrace();
}
}

-5普通写入,中文时乱码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void writeTest(){
try{
Properties properties=new Properties();
InputStream input=PropertiesTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(input);
//多添加几个值。
properties.setProperty("name","两个蝴蝶飞");
properties.setProperty("sex","男");
//properties.put("name","两个蝴蝶飞");
//可以用继承Hashtable 的put 方法写入值
// properties.put("sex","男");
//将添加的值,连同以前的值一起写入 新的属性文件里面。
OutputStream out=new FileOutputStream("D:\\jdbc.properties");
properties.store(out,"填充数据");
}catch(Exception e){
e.printStackTrace();
}
}

-6解决乱码写入的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void write2Test(){
try{
Properties properties=new Properties();
//用绝对路径
InputStream input=new BufferedInputStream(new FileInputStream("D:\\workspace\\JavaLearn\\src\\jdbc.properties"));
properties.load(new InputStreamReader(input,"utf-8"));
//多添加几个值。
properties.setProperty("name","两个蝴蝶飞");
properties.setProperty("sex","男");
OutputStream output=new
FileOutputStream("D:\\jdbc.properties");
OutputStreamWriter out=new OutputStreamWriter(output,"utf-8");
properties.store(out,"填充数据");
}catch(Exception e){
e.printStackTrace();
}
}

-7导出到 .xml 配置文件 storeToXML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void xmlWriteTest(){
try{
//处理成编码样式。
Properties properties=new Properties();
//多添加几个值。
properties.setProperty("name","两个蝴蝶飞");
properties.setProperty("sex","男");
OutputStream output=new FileOutputStream("D:\\jdbc.xml");
//编码设置成utf-8的形式。
properties.storeToXML(output,"填充到xml","utf-8");
}catch(Exception e){
e.printStackTrace();
}
}

-8导出XML 配置文件 loadFromXML

1
2
3
4
5
6
7
8
9
10
11
 @Test
public void xmlReadTest(){
try{
Properties properties=new Properties();
InputStream input=new BufferedInputStream(new FileInputStream("D:\\jdbc.xml"));
properties.loadFromXML(input);
properties.list(System.out);
}catch(Exception e){
e.printStackTrace();
}
}

参考文章

properties文件 , properties类, 的作用
properties文件
Java基础——Properties类

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

You Found Me.

支付宝
微信