目录
2.1 不使用现成的API, 自己去实现对ini 或者properties文件的读写
2.2 使用现成的API: Appache Commons Configuration
4.1 使用PropertiesConfiguration配置类读取.properties文件
4.2 使用XMLConfiguration配置类读取.xml文件
1. 要求
设计一个类IniFile:可以实现对.ini文件的读写
设计一个类PropertiesFile: 可以实现对.properties文件的读写
2. 分析
2.1 不使用现成的API, 自己去实现对ini 或者properties文件的读写
以properterties 为例子,处理思路:
匹配等号,左边是key 右边是value,然后匹配换行符(value值全部找到)
还要考虑 注释,匹配到井号,则跳过
上述这些是对文件的一个全文的扫描
代码略
2.2 使用现成的API: Appache Commons Configuration
相关依赖包(如果是maven项目,配置好pom.xml即可):
commons-configuration-1.10.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
推荐文章:apache commons组件学习系列之configuration库
推荐文章:apache commons-configuration包读取配置文件
3. 实现代码
3.1 类PropertiesFile
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import java.io.File;
import java.io.IOException;
public class PropertiesFile {
File file;
String filePath = null;
PropertiesConfiguration config = new PropertiesConfiguration();
//创建Properties日志文件
public void createLog(String p_filePath){
this.filePath = p_filePath;
file = new File(this.filePath);
if(!file.exists()){
try {
file.createNewFile(); //若文件不存在,则先创建
} catch (IOException e) {
e.printStackTrace();
}
}
try {
//config.load(new File(this.filePath)); //导入需要的properties文件
config.load(file); //导入需要的properties文件
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
//往日志文件中写内容(键值对,用=)
public void write(String p_key, String p_value){
config.setProperty(p_key, p_value);
}
//从日志文件中读取内容(根据键读取值)
public String read(String p_key){
Object value = config.getProperty(p_key);
return value.toString();
}
//保存内容然后关闭日志文件
public void closeLog(){
File file = new File(this.filePath);
try {
config.save(file);
} catch (ConfigurationException e) {
e.printStackTrace();
}
this.file = null;
this.config = null;
this.filePath = null;
}
}
3.2 类iniFile
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.HierarchicalINIConfiguration;
import java.io.File;
import java.io.IOException;
public class IniFile {
private String fileName = null;
HierarchicalINIConfiguration ini = null; //定义,全局
//创建ini日志文件
public void createLog(String p_fileName){
this.fileName = p_fileName;
File file = new File(this.fileName);
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
ini = new HierarchicalINIConfiguration(this.fileName); //也可放在上面全局定义的地方
//ini.load(new File(this.fileName)); //导入需要的ini文件
ini.load(file); //导入需要的ini文件
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
//往日志文件中写内容(section, 键值对)
public void write(String p_section, String p_key, String p_value){
ini.setProperty(p_section + "." + p_key, p_value); //注意这个固定格式,规定写法如此,记住即可
}
//从日志文件中读取内容(根据section和键,读取值)
public String read(String p_section, String p_key){
return ini.getString(p_section + "." + p_key); //注意这里用的是getString的方法,不是getProperties
}
//保存内容然后关闭日志文件
public void closeLog(){
try {
ini.save();
} catch (ConfigurationException e) {
e.printStackTrace();
}
this.fileName = null;
this.ini = null;
}
}
3.3 测试类(入口类)MyDemo
public class MyDemo {
public static void main(String[] args) {
//操作.ini文件
IniFile ini = new IniFile();
ini.createLog("C:/iniLog.ini");
ini.write("URL1", "url1", "www.baidu.com");
System.out.println(ini.read("URL1", "url1"));
ini.closeLog();
//操作.properties文件
PropertiesFile pro = new PropertiesFile();
pro.createLog("C:/proLog.properties");
pro.write("url2", "www.sina.com");
pro.write("url3", "www.12345.cn");
System.out.println(pro.read("url2"));
System.out.println(pro.read("url3"));
pro.closeLog();
}
}
3.4 运行结果
控制台输出;
www.baidu.com
www.sina.com
www.12345.cn
生成日志文件:
iniLog.ini
[URL1]
url1 = www.baidu.comproLog.properties
url2 = www.sina.com
url3 = www.12345.cn
4. 补充练习
4.1 使用PropertiesConfiguration配置类读取.properties文件
package com.tese.demo;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import java.io.File;
import java.util.List;
public class PropertiesFile {
static String proFileName = "C:\\Users\\pearl\\Desktop\\road\\2022\\conFile\\demo.properties";
static File proFile = new File(proFileName);
static PropertiesConfiguration propertiesConfiguration = null;
static {
propertiesConfiguration = new PropertiesConfiguration();
try {
propertiesConfiguration.load(proFile);
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
//当文件的内容发生改变时,配置对象也会刷新
// propertiesConfiguration.setReloadingStrategy(new FileChangedReloadingStrategy());
//读String
public static String getString(String key){
return propertiesConfiguration.getString(key);
}
//读int
public static int getIntValue(String key){
return propertiesConfiguration.getInt(key);
}
//读boolean
public static boolean getBoolean(String key){
return propertiesConfiguration.getBoolean(key);
}
//读List
public static List<?> getListValue(String key){
return propertiesConfiguration.getList(key);
}
//读Array数组
public static String[] getArrayValue(String key){
return propertiesConfiguration.getStringArray(key);
}
public static void main(String[] args) {
String name = PropertiesFile.getString("name");
System.out.println("name: " + name);
int age = PropertiesFile.getIntValue("age");
System.out.println("age: " + age);
boolean flag = PropertiesFile.getBoolean("flag");
System.out.println("flag: " + flag);
List<?> list = PropertiesFile.getListValue("interest");
System.out.println("interest list: " + list);
String[] strArray = PropertiesFile.getArrayValue("interest");
System.out.println("interest array: " + strArray[0]);
}
}
demo.properties内容:
name=Sheryl
age=18
flag=true
interest=movie, book, shopping
输出结果:
name: Sheryl
age: 18
flag: true
interest list: [movie, book, shopping]
interest array: movieProcess finished with exit code 0
4.2 使用XMLConfiguration配置类读取.xml文件
package com.tese.demo;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import java.io.File;
public class XmlFile {
public static String xmlFileName = "C:\\Users\\pearl\\Desktop\\road\\2022\\conFile\\demo.xml";
public static File xmlFile = new File(xmlFileName);
static XMLConfiguration xmlConfiguration = null;
static {
xmlConfiguration = new XMLConfiguration();
try {
xmlConfiguration.load(xmlFile);
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws ConfigurationException {
System.out.println(xmlConfiguration.getString("database.url"));
System.out.println(xmlConfiguration.getString("database.port"));
System.out.println(xmlConfiguration.getString("database.login"));
System.out.println(xmlConfiguration.getString("database.password"));
}
}
//demo.xml的内容
<?xml version="1.0" encoding="UTF-8"?>
<config>
<database>
<url>127.0.0.1</url>
<port>8080</port>
<login>Sheryl</login>
<password>123</password>
</database>>
</config>
//输出结果
127.0.0.1
8080
Sheryl
123Process finished with exit code 0
遇到的问题:
在运行代码时,一直报错:java.lang.NoClassDefFoundError: org/apache/commons/collections/CollectionUtils......
原因:忘记添加相关依赖
解决方案:
上面代码是在Maven项目中运行的,此时,需要在pom.xml中添加下方的依赖信息,保存。
重新运行程序,解决。
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>