Java 配置文件 properties 文件中
Java 开发中,properties 文件是常见的配置文件格式之一,Java 也提供了对 properties 文件的解析和使用的 API,本文将介绍 Java 中如何解析 properties 文件,以及在实际开发中的应用。
1. 什么是 properties 文件
properties 文件是一种基于文本格式的配置文件,以 key-value 的方式存储配置信息,其中 key 和 value 之间使用等号(=)或冒号(:)进行分隔,key 和 value 之间的空格会被忽略。properties 文件通常以 .properties 后缀名保存在文件系统中。
一个样例的 properties 文件内容如下:
```
# 数据库配置
database.url=jdbc:mysql://localhost:3306/mydb
database.username=root
database.password=123456
# 其他配置
app.name=My Application
app.version=1.0
```
2. 如何解析 properties 文件
Java 中提供了三种方式来解析 properties 文件,分别是:
- Properties 类
- ResourceBundle 类
- Apache Commons Configuration
2.1 Properties 类
Properties 类是 Java 标准库中提供的解析 properties 文件的 API,学习成本较低,使用也很方便,以下为它的基本使用步骤。
示例代码:
```java
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesTest {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("config.properties");
Properties props = new Properties();
props.load(fis);
String url = props.getProperty("database.url");
String username = props.getProperty("database.username");
String password = props.getProperty("database.password");
String appName = props.getProperty("app.name");
String appVersion = props.getProperty("app.version");
}
}
```
2.2 ResourceBundle 类
ResourceBundle 类也是 Java 标准库中提供的解析 properties 文件的 API,主要用于国际化和本地化,可以根据语言环境自动加载对应的配置文件。
示例代码:
```java
import java.util.ResourceBundle;
public class ResourceBundleTest {
public static void main(String[] args) {
ResourceBundle rb = ResourceBundle.getBundle("config");
String url = rb.getString("database.url");
String username = rb.getString("database.username");
String password = rb.getString("database.password");
String appName = rb.getString("app.name");
String appVersion = rb.getString("app.version");
}
}
```
2.3 Apache Commons Configuration
Apache Commons Configuration 是一个第三方的常用配置文件解析库,除了解析 properties 文件外,还支持其他多种格式的配置文件。相对于 Properties 类和 ResourceBundle 类,它提供的功能更加强大,可以很方便地实现属性的读写、监听、合并等功能。
示例代码:
```java
import java.io.File;
import org.apache.commons.configuration2.PropertiesConfiguration;
public class CommonsConfigurationTest {
public static void main(String[] args) throws Exception {
PropertiesConfiguration config = new PropertiesConfiguration();
config.setFile(new File("config.properties"));
config.load();
String url = config.getString("database.url");
String username = config.getString("database.username");
String password = config.getString("database.password");
String appName = config.getString("app.name");
String appVersion = config.getString("app.version");
}
}
```
3. properties 文件的应用
在实际开发中,我们经常需要使用 properties 文件来存储配置信息,常见的应用场景包括:
3.1 数据库连接池配置
在 Web 开发中,数据库连接池是一个非常重要的应用,多个线程需要共享数据库连接,连接池的配置信息可以存储在 properties 文件中,具体实现参考以下代码。
示例代码:
```java
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
public class ConnectionPool {
private static String url;
private static String username;
private static String password;
private static int initialSize;
private static int maxSize;
private static int maxWait;
private static BlockingQueue
static {
try (FileInputStream fis = new FileInputStream("config.properties")) {
Properties props = new Properties();
props.load(fis);
url = props.getProperty("database.url");
username = props.getProperty("database.username");
password = props.getProperty("database.password");
initialSize = Integer.parseInt(props.getProperty("pool.initial.size"));
maxSize = Integer.parseInt(props.getProperty("pool.max.size"));
maxWait = Integer.parseInt(props.getProperty("pool.max.wait"));
pool = new ArrayBlockingQueue<>(maxSize);
for (int i = 0; i < initialSize; i++) {
pool.offer(createConnection());
}
} catch (IOException | SQLException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
private static Connection createConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection(url, username, password);
}
public static Connection getConnection() throws InterruptedException, SQLException {
Connection connection = pool.poll(maxWait, TimeUnit.MILLISECONDS);
if (connection == null) {
connection = createConnection();
}
return connection;
}
public static void releaseConnection(Connection connection) throws SQLException {
if (pool.size() < maxSize) {
pool.offer(connection);
} else {
connection.close();
}
}
}
```
3.2 配置管理工具
当系统需要经常更新配置信息时,例如系统开关、超时时间、阈值等等,我们可以通过定时读取 properties 文件的方式来实现配置信息的动态更新。这样在不重启系统的情况下,就可以实现系统配置的变更。
示例代码:
```java
import java.io.FileInputStream;
import java.util.Properties;
public class ConfigManager {
private static final String CONFIG_FILE = "config.properties";
private static ConfigManager instance = new ConfigManager();
private Properties properties;
private ConfigManager() {
try (FileInputStream fis = new FileInputStream(CONFIG_FILE)) {
properties = new Properties();
properties.load(fis);
} catch (Exception e) {
throw new RuntimeException("Unable to load configuration file " + CONFIG_FILE, e);
}
}
public static ConfigManager getInstance() {
return instance;
}
public String getString(String key) {
return properties.getProperty(key);
}
public int getInt(String key) {
String value = properties.getProperty(key);
return Integer.parseInt(value);
}
}
```
4. 结论
本文介绍了 properties 文件的定义以及 Java 中三种解析 properties 文件的方式,以及在实际开发中的应用。
扫码咨询 领取资料