JAVA中读取配置文件以及修改配置文件

柔光的暖阳◎ 2022-05-28 04:39 632阅读 0赞

1.ServletContext方式

  1. 采用ServletContext读取配置文件realpath,然后通过文件流读出来。
  2. 优点:可以读取任意位置的文件
  3. 采用文件流读取,所以可以读取不同格式的文件
  4. 缺点:不能在servlet外面读取配置文件
  5. 实现:
  6. package com.xunjie.common.utils;
  7. import java.io.FileInputStream;
  8. import java.io.InputStreamReader;
  9. import java.util.Properties;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. public class Profile {
  13. // 采用ServletContext读取配置文件的realpath,然后通过文件流读取出来
  14. public void readProfileByServletContext(HttpServletRequest request, HttpServletResponse response) {
  15. // 通过servletcontext读取到文件路径
  16. String realPath = request.getServletContext().getRealPath("jdbc.properties");
  17. //InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream
  18. InputStreamReader reader;
  19. //Properties类,主要用于读取Java的配置文件
  20. Properties props = new Properties();
  21. try {
  22. // 建议使用Reader来读,因为reader体系中有个InputStreamReader可以指定编码
  23. reader = new InputStreamReader(new FileInputStream(realPath), "utf-8");
  24. // load ( InputStream inStream)方法
  25. // 从输入流中读取属性列表(键和元素对)。 通过对指定的文件(比如说上面的jdbc.properties文件)进行装载来获取该文件中的所有键 - 值对。 以供 getProperty ( String key) 来搜索。
  26. props.load(reader);
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. // getProperty ( String key)方法,用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value。
  31. String jdbcUrl = props.getProperty("url");
  32. System.out.println(jdbcUrl);
  33. System.out.println(realPath);
  34. }
  35. }
  36. 使用Junit测试输出结果
  37. Junit使用参考:https://blog.csdn.net/qq\_37725650/article/details/79409589
  38. package com.xunjie.test;
  39. import org.junit.Before;
  40. import org.junit.Test;
  41. import org.junit.runner.RunWith;
  42. import org.springframework.mock.web.MockHttpServletRequest;
  43. import org.springframework.mock.web.MockHttpServletResponse;
  44. import org.springframework.test.context.ContextConfiguration;
  45. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  46. import com.xunjie.common.utils.Profile;
  47. @RunWith(SpringJUnit4ClassRunner.class)
  48. @ContextConfiguration(locations = { "classpath:spring.xml" })
  49. public class ProfileTest {
  50. private MockHttpServletRequest request;
  51. private MockHttpServletResponse response;
  52. @Before
  53. public void setUp() {
  54. request = new MockHttpServletRequest();
  55. request.setCharacterEncoding("UTF-8");
  56. response = new MockHttpServletResponse();
  57. }
  58. @Test
  59. public void test() {
  60. System.err.println("-----测试开始-start-----");
  61. Profile profile = new Profile();
  62. profile.readProfileByServletContext(request, response);
  63. System.err.println("-----测试结束-end-----");
  64. }
  65. }

测试结果:

  1. -----测试开始-start-----
  2. jdbc:mysql://127.0.0.1:3306/yeebi?useUnicode=true&&characterEncoding=UTF-8
  3. E:\WorkSpace\xunjie\xunjie\target\classes\jdbc.properties
  4. -----测试结束-end-----

2.通过ResourceBundle类获取配置文件资源

  1. 优点:1可以以全限定类名的方式加载资源2可以在非web应用里加载资源
  2. 缺点:只能加载类下面的资源文件,且只能读取properties文件
  3. /**
  4. * @Title: getProfileByResourceBundle
  5. * @Description: 通过ResourceBundle类获取配置文件资源
  6. * @param propertyName 配置文件名称
  7. * 调用方式:
  8. * 1.配置文件放在resource源包下,不用加后缀
  9. * PropertiesUtil.getProfileByResourceBundle("message");
  10. * 2.放在包里面的
  11. * PropertiesUtil.getProfileByResourceBundle("com.test.message");
  12. * @return Map<String,String> 以Map键值对方式返回配置文件内容
  13. */
  14. public static Map<String, String> getProfileByResourceBundle(String propertyName) {
  15. // 获得资源包
  16. ResourceBundle rb = ResourceBundle.getBundle(propertyName.trim());
  17. // 通过资源包拿到所有的key
  18. Enumeration<String> allKey = rb.getKeys();
  19. Map<String, String> profileMap = new HashMap<String, String>();
  20. // 遍历key 得到 value
  21. while (allKey.hasMoreElements()) {
  22. String key = allKey.nextElement();
  23. String value = (String) rb.getString(key);
  24. //将文件内容存入map
  25. profileMap.put(key, value);
  26. }
  27. return profileMap;
  28. }
  29. 测试运行结果:
  30. public static void main(String[] args) {
  31. //我的文件直接放在了src下,所以直接传入文件名称就可以了
  32. Map<String, String> profileMap = Profile.getProfileByResourceBundle("jdbc");
  33. String jdbcUrl = profileMap.get("url");
  34. System.out.println(jdbcUrl);
  35. }
  36. 控制台输出:
  37. jdbc:mysql://127.0.0.1:3306/yeebi?useUnicode=true&&characterEncoding=UTF-8

3.通过ClassLoader方式进行读取

  1. /**
  2. * @Title: getProfileByClassLoader
  3. * @Description: 采用ClassLoader(类加载器)方式进行读取配置信息
  4. * @return Map<String,Object> 以Map键值对方式返回配置文件内容
  5. * 优点:可以在非Web应用中读取配置资源信息,可以读取任意的资源文件信息
  6. * 缺点:只能加载类classes下面的资源文件
  7. * @throws
  8. */
  9. public static Map<String, Object> getProfileByClassLoader() {
  10. // 通过ClassLoader获取到文件输入流对象
  11. // 配置文件放在resource源包下,直接写文件名即可,需要后缀名"jdbc.properties"
  12. // 放在包里面的,需要写上包路径,例如:在test包下"com/test/jdbc.properties"),Profile为当前所在类类名
  13. InputStream in = Profile.class.getClassLoader().getResourceAsStream("jdbc.properties");
  14. // 获取文件的位置
  15. String filePath = Profile.class.getClassLoader().getResource("jdbc.properties").getFile();
  16. System.out.println(filePath);
  17. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  18. Properties props = new Properties();
  19. Map<String, Object> profileMap = new HashMap<String, Object>();
  20. try {
  21. props.load(reader);
  22. for (Object key : props.keySet()) {
  23. profileMap.put(key.toString(), props.getProperty(key.toString()));
  24. }
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. return profileMap;
  29. }

测试运行结果:

  1. public static void main(String[] args) {
  2. Map<String, Object> profileMap = Profile.getProfileByClassLoader();
  3. System.out.println(profileMap.get("url"));
  4. }
  5. 控制台输出:
  6. /E:/WorkSpace/xunjie/xunjie/target/classes/jdbc.properties
  7. jdbc:mysql://127.0.0.1:3306/yeebi?useUnicode=true&&characterEncoding=UTF-8

4.使用Sping提供的PropertiesLoaderUtils类读取配置文件

  1. 当然需要导入spring核心包
  2. /**
  3. * @Title: getProfileByPropertiesLoaderUtils
  4. * @Description: Spring 提供的 PropertiesLoaderUtils 允许您直接通过基于类路径的文件地址加载属性资源
  5. * 最大的好处就是:实时加载配置文件,修改后立即生效,不必重启
  6. * @return Map<String,Object>
  7. */
  8. public static Map<String, Object> getProfileByPropertiesLoaderUtils() {
  9. Properties props = new Properties();
  10. Map<String, Object> profileMap = new HashMap<String, Object>();
  11. try {
  12. props = PropertiesLoaderUtils.loadAllProperties("jdbc.properties");
  13. for (Object key : props.keySet()) {
  14. profileMap.put(key.toString(), props.getProperty(key.toString()));
  15. }
  16. } catch (IOException e) {
  17. System.out.println(e.getMessage());
  18. }
  19. return profileMap;
  20. }

测试运行结果:

  1. public static void main(String[] args) {
  2. Map<String, Object> profileMap = Profile.getProfileByPropertiesLoaderUtils();
  3. System.out.println(profileMap.get("url"));
  4. }
  5. 控制台输出:
  6. jdbc:mysql://127.0.0.1:3306/yeebi?useUnicode=true&&characterEncoding=UTF-8

5.修改配置文件

只是修改了classes下的文件,源文件并没有改变。

  1. /**
  2. * 传递键值对的Map,更新properties文件
  3. *
  4. * @param fileName
  5. * 文件名(放在resource源包目录下),需要后缀
  6. * @param keyValueMap
  7. * 键值对Map
  8. */
  9. public static void updateProperties(String fileName, Map<String, String> keyValueMap) {
  10. // 输入流
  11. // InputStream
  12. // inputStream=PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName);
  13. // 获取文件的路径
  14. String filePath = Profile.class.getClassLoader().getResource(fileName).getFile();
  15. System.out.println("propertiesPath:" + filePath);
  16. Properties props = new Properties();
  17. BufferedReader br = null;
  18. BufferedWriter bw = null;
  19. try {
  20. // 从输入流中读取属性列表(键和元素对)
  21. br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
  22. props.load(br);
  23. br.close();
  24. // 写入属性文件
  25. bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath)));
  26. // 清空旧的文件
  27. // props.clear();
  28. for (String key : keyValueMap.keySet())
  29. props.setProperty(key, keyValueMap.get(key));
  30. props.store(bw, "改变数据");
  31. System.out.println(props.getProperty("url"));
  32. bw.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. System.err.println("Visit " + filePath + " for updating " + "" + " value error");
  36. } finally {
  37. try {
  38. br.close();
  39. bw.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }

修改前:

20180402094618380

运行测试结果即修改后:

  1. public static void main(String[] args) {
  2. Profile.updateProperties("jdbc.properties", new HashMap<String, String>() {
  3. {
  4. put("initialSize", "6");
  5. put("test", "修改文件属性");
  6. }
  7. });
  8. }

20180402094804758

发表评论

表情:
评论列表 (有 0 条评论,632人围观)

还没有评论,来说两句吧...

相关阅读