目录
一、(.properties后缀)的配置文件。
(1)基本介绍。
(2)基本语法。
1、键值对。
2、如何注释?
3、编码类型。
4、空白字符。
5、多行值。
(3)".properties后缀"配置文件的内容读取详细。(核心)
1、java.util.Properties。
2、".properties后缀"配置文件读写的核心。(方法)
二、3种不同的情况的位置——如何正确读取?
(0)配置文件代码。
(1)(.properties)配置文件放在当前整个项目下。
1、项目结构位置图。
2、解释。
3、测试类代码。
4、运行结果图。(成功获取到配置文件里的属性)
5、问题。
(2)(.properties)配置文件放在与之有关系的类的所在目录(包)下。
1、项目结构位置图。
2、解释。
3、测试类代码。
4、运行结果图。(成功获取到配置文件里的属性)
5、问题。
(3)(.properties)配置文件放在当前项目的src目录下。
1、项目结构位置图。
2、解释。
3、测试类代码。
4、运行结果图。(成功获取到配置文件里的属性)
5、编译后,文件结构。
一、(.properties后缀)的配置文件。
(1)基本介绍。
- Java的".properties后缀"的文件是一种用于存储配置信息的文件格式。
- 它通常用于存储程序运行时需要的参数、环境变量等配置信息。
(2)基本语法。
1、键值对。
".properties后缀"文件中的配置信息以键值对的形式存储。
也就是配置文件(.properties)的语法是:key——value。(类似于Map)
每行只有一个键值对,且键和值之间用等号(
=
)分隔。
2、如何注释?
- 文件中可以包含注释,注释以井号(
#
)或感叹号(!
)开头,从该字符开始到行尾的内容都会被视作注释,不会被程序解析。
3、编码类型。
- ".properties后缀"文件通常使用ISO-8859-1字符编码。
- 但也可以使用Unicode编码(如UTF-8)。如果使用Unicode编码,文件的第一行必须是相关的声明。
4、空白字符。
- 键或值前后的空白字符会被忽略,但值中的空白字符会被保留。
5、多行值。
- 如果一个值需要跨越多行,可以在行尾使用反斜杠(
\
)来表示值的延续。
(3)".properties后缀"配置文件的内容读取详细。(核心)
1、java.util.Properties。
- Properties是 Java 中的一个类,属于java.util包。
- 它用于处理属性文件,这些文件通常以 ".properties"为后缀名。所以(.properties后缀)格式的配置文件内容的解析较方便!
- Properties类继承自HashTable类,因此它是一个散列表,存储键值对(key-value pairs),其中键和值都是字符串类型。
2、".properties后缀"配置文件读写的核心。(方法)
- Properties类提供了方法来加载和保存属性文件。具体方法如下。
- load()方法用于从输入流中读取属性列表。(key——value结构)
- 通过load()方法,可以把(.properties)文件读取并解析成(key/value)结构并存储到Properties对象中。
- 可以通过输入字节流或者输入字符流读取。
- 配合FileInputStream类对象可以获取指定文件名的输入字节流。
- 利用Properties对象的getProperty(键名)方法拿到键值(属性值/参数/变量)
- 而store()方法用于将属性列表写入输出流(字节输出流或字符输出流)。
- 这里就不详细讲了。(用的不多,方法类似于读)
二、3种不同的情况的位置——如何正确读取?
(0)配置文件代码。
(1)(.properties)配置文件放在当前整个项目下。
(可能会出现将自己的类打包给别人,出现配置文件丢失情况!)
1、项目结构位置图。
2、解释。
- 这里的new FileInputStream("xxConfig.properties")。文件名"xxConfig.properties"写的是相对路径,而不是绝对路径。
- 之所以能读取到,是因为它执行时会扫描该项目的系统路径("user.dir")下的文件。注意它是动态的,随着你的项目文件放置的位置,也会改变。也就是通过FileInputStream获取到配置文件的流,再加载配置文件,存储到Properties对象中。
- 然后刚好(.properties)配置文件位于当前整个项目目录下,就可以扫描进行读取。
3、测试类代码。
package com.fs.demo; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.util.Properties; /** * @Title: Demo01 * @Author HeYouLong * @Package com.fs.demo * @Date 2024/11/9 上午9:34 * @description: 测试类:需要使用(.properties后缀)的配置文件 */ public class Demo01 { public static void main(String[] args) throws Exception { //创建Properties对象 Properties properties = new Properties(); //加载指定的配置文件(xxConfig.properties) properties.load(new FileInputStream("xxConfig.properties")); //通过键名获取对应的键值 /* * location = china * WriteDateTime = 2024-11-09 * weather = sun * */ String location = properties.getProperty("location"); String writeDateTime = properties.getProperty("WriteDateTime"); String weather = properties.getProperty("weather"); System.out.println("地点:"+location+",写作时间:"+writeDateTime+",天气:"+weather); } }
4、运行结果图。(成功获取到配置文件里的属性)
5、问题。
(2)(.properties)配置文件放在与之有关系的类的所在目录(包)下。
(通过字节码的路径去寻找配置文件。)
1、项目结构位置图。
2、解释。
- 通过(类名.class)获取类的资源流。则要求类与文件所在同一个目录(包)。
- 再调用方法getResourceAsStream():拿到一个资源将其变成流的方式返回来。
- 再调用Properties对象的load()方法去加载配置文件资源。
3、测试类代码。
package com.fs.demo; import java.io.FileInputStream; import java.util.Properties; /** * @Title: Demo02 * @Author HeYouLong * @Package com.fs.demo * @Date 2024/11/9 上午11:19 * @description: 测试类:需要使用(.properties后缀)的配置文件 */ public class Demo02 { public static void main(String[] args) throws Exception { //创建Properties对象 Properties properties = new Properties(); /*系统属性:项目的路径 System.out.println(System.getProperty("user.dir"));*/ //加载指定的配置文件(xxConfig.properties) //通过获取类的资源流,通过类加载器加载配置文件。要求类与文件所在同一个目录(包) properties.load(Demo02.class.getResourceAsStream("xxConfig.properties")); //通过键名获取对应的键值 /* * location = china * WriteDateTime = 2024-11-09 * weather = sun * */ String location = properties.getProperty("location"); String writeDateTime = properties.getProperty("WriteDateTime"); String weather = properties.getProperty("weather"); System.out.println("地点:"+location+",写作时间:"+writeDateTime+",天气:"+weather); } }
4、运行结果图。(成功获取到配置文件里的属性)
5、问题。
- 虽然编译后,成功出现了配置文件,不会丢失。
- 但是一般不这么写。因为包下就是类。配置文件是配置文件。所以一般分开。配置文件放到src目录下。也就是下面第三种情况。
(3)(.properties)配置文件放在当前项目的src目录下。
(推荐:将项目打包发给别人,既不会出现"配置文件"丢失问题!也符合代码常规)
1、项目结构位置图。
2、解释。
- 获取类加载器的方法:类名.class.getClassLoader()。
- 通过类加载器获取文件的输入流——>这样就可以获取加载到内存中的配置文件的流。最后再加载配置文件。
- 再调用方法getResourceAsStream():拿到一个资源将其变成流的方式返回来。
- 再调用Properties对象的load()方法去加载配置文件资源。
- 程序执行的流程图。
- 通过类加载器(ClassLoader)将硬盘上的编译好的文件(.class:字节码文件)加载到内存中。
3、测试类代码。
package com.fs.demo; import java.util.Properties; /** * @Title: Demo03 * @Author HeYouLong * @Package com.fs.demo * @Date 2024/11/9 上午11:34 * @description: 测试类:需要使用(.properties后缀)的配置文件 */ public class Demo03 { public static void main(String[] args) throws Exception { //创建Properties对象 Properties properties = new Properties(); /*系统属性:项目的路径 System.out.println(System.getProperty("user.dir"));*/ //加载指定的配置文件(xxConfig.properties) //获取类加载器:getClassLoader() //通过类加载器获取文件的输入流——>这样就可以获取加载到内存中的配置文件的流 //再加载配置文件 properties.load(Demo03.class.getClassLoader().getResourceAsStream("xxConfig.properties")); //通过键名获取对应的键值 /* * location = china * WriteDateTime = 2024-11-09 * weather = sun * */ String location = properties.getProperty("location"); String writeDateTime = properties.getProperty("WriteDateTime"); String weather = properties.getProperty("weather"); System.out.println("地点:"+location+",写作时间:"+writeDateTime+",天气:"+weather); } }
4、运行结果图。(成功获取到配置文件里的属性)
5、编译后,文件结构。