java 如何读取properties文件
作者:Marydon 发布时间:2023-08-28 05:23:01
标签:java,读取,properties
1.情景展示
将要访问的接口地址等常用的配置添加到properties文件中,比直接写到java类中的好处在于:
当我们需要修改相应配置时,直接修改properties文件,重启tomcat即可,避免了重新编译引用该配置的java文件,同时,也便于项目的维护。
方式一
通过spring的工具类PropertiesLoaderUtils来实现对properties文件的解析
所需jar包:spring的核心jar包,spring-core-版本号.jar
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.springframework.core.io.support.PropertiesLoaderUtils;
/**
* 借助spring读取Properties文件
* @explain Spring 提供的 PropertiesLoaderUtils
* 允许您直接通过基于类路径的文件地址加载属性资源 最大的好处就是:实时加载配置文件,修改后立即生效,不必重启
* @author Marydon
* @creationTime 2018年5月23日上午9:58:59
* @version 1.0
* @since
* @email marydon20170307@163.com
*/
public class PropertiesUtils {
/**
* 读取properties文件
* @param fileName properties文件名及所在路径
* @explain 参数说明
* 1.传递的参数不是properties类型文件,不会报错,返回的是空Map;
* 2.传递的参数是根本不存在的properties文件,也不会报错,返回的是空Map;
* 3.传递的参数可以带路径,可以正常解析到
* @return
*/
public static Map<String, String> readProperties(String fileName) {
Map<String, String> resultMap = new HashMap<String, String>();
try {
Properties props = PropertiesLoaderUtils.loadAllProperties(fileName);
for (Object key : props.keySet()) {
resultMap.put(key.toString(), props.get(key).toString());
}
} catch (IOException e) {
e.printStackTrace();
}
return resultMap;
}
/**
* @param args
*/
public static void main(String[] args) {
// Map map = readProperties("base/web/imageInfo/fileRootDirectories.properties");
Map map = readProperties("fileRootDirectories.properties");
for (Object key : map.keySet()) {
System.out.println(key.toString() + "=" + map.get(key).toString());
}
// 打印结果
// fileRootPath=uploadFiles
}
}
这种方式的缺点在于:
每次调用都要重新解析对应的properties文件,所以,我们可以在项目启动的时候,就把该文件加载到内存中(一次加载解析,永久使用)。
方式二
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* properties文件工具类
* @description
* 在该类被加载的时候,它就会自动读取指定位置的配置文件内容并保存到静态属性中,高效且方便,一次加载,可多次使用
* @author: Marydon
* @date: 2020年07月13日 0013 16:04
*/
public class PropertyUtils_old {
private static Logger logger = LoggerFactory.getLogger(PropertyUtils_old.class);
// 待解析的properties文件名称
private static final String FILE_NAME = "bill.properties";
// 用于接收解析过properties文件
private static Properties props;
// 静态代码块:在该类被加载到内容中时,该代码块会执行
static {
// 静态代码块执行时将要执行的方法
loadPropertiesFile();
}
synchronized static private void loadPropertiesFile() {
logger.debug("开始加载properties文件内容.......");
props = new Properties();
InputStream in = null;
try {
// 方式一:通过类加载器进行获取properties文件流(不用添加路径)
in = PropertyUtils_old.class.getClassLoader().getResourceAsStream(FILE_NAME);
// 方式二:通过类进行获取properties文件流(需要加/)
// in = PropertyUtils.class.getResourceAsStream("/bill.properties");
props.load(in);
} catch (NullPointerException e) {
logger.error("bill.properties文件未找到!");
} catch (IOException e) {
logger.error("出现IOException!");
} finally {
try {
if (null != in) {
in.close();
}
} catch (IOException e) {
logger.error("bill.properties文件流关闭出现异常");
}
}
logger.info("加载properties文件内容完成...........");
logger.info("properties文件内容:" + props);
}
/*
* 获取properties文件中指定key的value
* @date: 2020年07月13日 0013 16:17
* @param: key
* @return: java.lang.String
*/
public static String getProperty(String key) {
if (null == props) {
loadPropertiesFile();
}
return props.getProperty(key);
}
/*
* 获取properties文件中指定key的value
* @date: 2020年07月13日 0013 16:17
* @param: key
* @param: defaultValue
* @return: java.lang.String
*/
public static String getProperty(String key, String defaultValue) {
if (null == props) {
loadPropertiesFile();
}
return props.getProperty(key, defaultValue);
}
}
测试
public static void main(String[] args) {
System.out.println(getProperty("bill.czInterfaceAddress"));
}
方式一也可以按照方式二的形式,来达到一次加载,永久使用的效果。
来源:https://www.cnblogs.com/Marydon20170307/p/9148783.html


猜你喜欢
- 1.Java Io流的概念,分类,类图。1.1 Java Io流的概念java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操
- 前言这是用testng框架加selenium做的一个UI自动化测试的项目Java代码package com.justin;/**?* @au
- 在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,做法如下: //在使用多线程过程中,可能会遇到在一
- Android开发sdk过程中,很有可能在sdk内部引
- 首先我们常用的注解包括@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transie
- 什么是异步调用?异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等
- PipedWriter和PipedReader源码分析1. PipedWriter 源码(基于jdk1.7.40) package
- 前言在Android开发中我们可能会有延时执行某个操作的需求,例如我们启动应用的时候,一开始呈现的是一个引导页面,过了两三秒后,会自动跳转到
- 如何:对 Windows 窗体控件进行线程安全调用访问 Windows 窗体控件本质上不是线程安全的。 如果有两个或多个线程操作某一控件的状
- 今天收到了Android Studio3.0更新推送,在升级过程中遇到几个问题,在这里把问题和解决方法记录下,方便要升级的童鞋。如果还有童
- 本文实例讲述了C#中ExecuteNonQuery()返回值注意点。对于C#数据库程序设计有一定的借鉴价值。分享给大家供大家参考之用。具体分
- 本文想阐述一下当你开发Android应用并采用RxJava作为你的架构,尤其是有关网络请求时最常见的三种场景。我使用Retrofit来作为网
- selectMaps和selectList的区别selectList查询部分字段,会返回所有的,没查询的值为nullselectMaps 只
- 实例如下所示:/** * 创建多级目录文件 * * @param path 文件路径 * @throws IOException */pri
- 在分布式系统中,我们会需要 ID 生成器的组件,这个组件可以实现帮助我们生成顺序的或者带业务含义的 ID。目前有很多经典的 ID 生成方式,
- 前言微信群里的一个提问引发的这个问题,C#异步有多少种实现方式?首先想要知道C#异步有多少中实现方式,首先我们要知道.NET提供的执行异步操
- C#WinForm程序设计之图片浏览器,这次我们一起做一个图片查看器,这个图片查看器的原始图如下:我们首先来介绍一下这个原始图的构成:左边上
- 使用poi生成excel通常包含一下几个步骤创建一个工作簿创建一个sheet创建一个Row对象创建一个cell对象(1个row+1个cell
- mybatis自动生成代码(实体类、Dao接口等)是很成熟的了,就是使用mybatis-generator插件。 它是一个开源的插件,使用m
- 现在很多流行的框架,都可以很快的把分页效果做出来,但是作为一名程序员你必须得知道手写分页的流程:场景效果:一、分页的思路首先我们得知道写分页