Java中如何加载同一文件夹下多Properties文件并实现跨文件查属性
加载文件夹下所有Properties并实现跨文件属性查找(Java实现)
刚好之前做过类似的需求,给你分享一下Java里的实现方案,分步骤来,清晰明了~
一、核心思路
要搞定这个需求,其实就两步:
- 先遍历目标文件夹,把所有
.properties文件都加载到内存里 - 写个自定义的查找逻辑,要是在当前文件找不到目标属性,自动去其他加载好的文件里找
二、具体实现代码
1. 加载文件夹下所有Properties文件
先整个工具类,写个方法遍历文件夹,把所有符合条件的配置文件加载进来:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Properties; public class MultiPropertiesLoader { // 用List存所有加载的Properties对象,方便后续遍历查找 private List<Properties> propertiesList = new ArrayList<>(); // 加载指定文件夹下的所有.properties文件 public void loadAllPropertiesFromFolder(String folderPath) throws IOException { File folder = new File(folderPath); if (!folder.isDirectory()) { throw new IllegalArgumentException("传入的路径不是文件夹: " + folderPath); } // 筛选出所有.properties结尾的文件 File[] files = folder.listFiles((dir, name) -> name.toLowerCase().endsWith(".properties")); if (files == null) { return; // 文件夹为空或者没权限访问,直接返回 } for (File file : files) { Properties props = new Properties(); // 这里用UTF-8加载,避免中文乱码问题,默认是ISO-8859-1 try (InputStreamReader reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) { props.load(reader); propertiesList.add(props); System.out.println("成功加载配置文件: " + file.getName()); } } }
2. 实现跨文件属性查找逻辑
接着给工具类加个查找方法,遍历所有加载的Properties,直到找到目标属性:
// 查找属性,遍历所有加载的配置文件 public String getProperty(String key) { for (Properties props : propertiesList) { String value = props.getProperty(key); if (value != null) { return value; } } return null; // 所有文件都找不到就返回null } // 重载个带默认值的方法,更实用 public String getProperty(String key, String defaultValue) { String value = getProperty(key); return value != null ? value : defaultValue; } // 测试用的main方法 public static void main(String[] args) { try { MultiPropertiesLoader loader = new MultiPropertiesLoader(); // 替换成你自己的文件夹路径,比如"./config" loader.loadAllPropertiesFromFolder("./config"); // 测试查找属性 String dbUrl = loader.getProperty("db.url"); String apiKey = loader.getProperty("api.key", "default_api_key"); System.out.println("找到db.url: " + dbUrl); System.out.println("找到api.key: " + apiKey); } catch (IOException e) { e.printStackTrace(); } } }
三、一些要注意的细节
- 重复key的处理:如果多个文件里有相同的key,上面的代码会返回第一个加载到的值。要是你需要优先级,比如某个文件的配置优先,就调整文件的加载顺序就行(比如先加载优先级高的文件)
- 字符编码:刚才的代码用了UTF-8加载,要是你的配置文件是其他编码,对应改一下
StandardCharsets就行,避免乱码 - 资源释放:用了try-with-resources语法,文件流会自动关闭,不用担心资源泄漏
- 文件夹权限:确保程序对目标文件夹有读取权限,不然会加载失败
四、进阶优化(可选)
要是你需要更快的查找速度,可以把所有属性合并到一个Properties对象里,但要注意重复key会被后面加载的文件覆盖:
// 新增合并属性的方法 private Properties mergedProperties = new Properties(); public void mergeAllProperties() { for (Properties props : propertiesList) { mergedProperties.putAll(props); } } // 从合并后的对象直接获取属性 public String getMergedProperty(String key) { return mergedProperties.getProperty(key); }
这种方式查找更快,但丢失了“遍历查找”的灵活性,你可以根据自己的需求选哪种方案。
内容的提问来源于stack exchange,提问作者thisisdude
相关产品推荐
相关产品推荐

