Java小技巧:避免缓存,Java动态加载配置文件

2023-11-13

Java动态加载配置文件

 
关键: 每次读取都要重新生成流
 
今天无意间在项目的代码中看到如下这样一段简单加载配置文件的代码:
 
Properties prop = new Properties();
InputStream in = PropertiesTest.class.getClassLoader().getResourceAsStream("/config.properties");
prop.load(in);
 
 
其实代码本身是没有什么问题的
 
问题就是用这种方式来读取配置文件,会存在属性文件的缓存问题
 
什么意思呢?就是当系统在运行过程中第一次执行这段代码的时候,会将config.properties这个配置文件的信息保存在缓存当中,进而再次执行该段代码时候会从缓存当中读取,而不是再次读取config.properties配置文件
 
换句话来讲,当系统在运行时,我们去修改配置文件的相应信息,此时配置文件不会立即生效除非重启系统程序
 
所以这样操作比较繁琐,尤其是在配置文件修改频繁的情况下。所以让Java动态的加载配置文件是很有必要的
 
以下是我粗糙修改后动态加载配置文件的代码:
 
Properties prop = new Properties();
String path = Thread.currentThread().getContextClassLoader().getResource("config.properties").getPath();
path = URLDecoder.decode(path, "UTF-8");
FileInputStream in = new FileInputStream(path);
prop.load(in);
 
用这种方法来获取配置文件的绝对路径,再以流的形式读取配置文件传入,避免了上述配置文件缓存的问题,能实现配置文件的动态加载。我们在程序运行的过程当中修改配置文件相应信息,程序再次执行会直接读取生效。
 
path = URLDecoder.decode(path, "UTF-8");
 
至于上面这句代码,是我后来添加的,主要是用来转换文件路径,避免空格的问题。若不用这句代码对路径进行转换,获取的文件路径当中会包含空格,且路径的空格会被替代为‘%20’,这样直接读取会导致系统找不到文件
 
 
 
直接,我三个文件来研究:
  1. package com.cn.test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.net.URLDecoder;
  6. import java.util.Properties;
  7. import java.util.Scanner;
  8. publicclassFileTest{
  9. publicstaticvoid main(String[] args)throwsIOException{
  10. Properties prop=newProperties();
  11. String path=null;
  12. System.out.println(newFile("").getCanonicalPath()+"\\setting.txt");
  13. // String path = Thread.currentThread().getContextClassLoader().getResource("setting.txt").getPath();
  14. if(path==null)
  15. {
  16. path="./setting.txt";
  17. }
  18. FileInputStream in=null;
  19. while(true){
  20. Scanner sc =newScanner(System.in);
  21. String s = sc.next();
  22. char c = s.charAt(0);
  23. if(c=='0')
  24. {
  25. break;
  26. }
  27. try{
  28. path =URLDecoder.decode(path,"UTF-8");
  29. in =newFileInputStream(path);
  30. prop.load(in);
  31. prop.list(System.out);
  32. }catch(Exception e){
  33. e.printStackTrace();
  34. }finally{
  35. try{
  36. if(in!=null){
  37. in.close();
  38. }
  39. }catch(IOException e){
  40. e.printStackTrace();
  41. }
  42. }
  43. }
  44. }
  45. }
 
那个配置文件:
  1. A=2323333dsfds
 
 
可以动态的进行输入输出的哦



转载于:https://www.cnblogs.com/xujintao/p/7587528.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java小技巧:避免缓存,Java动态加载配置文件 的相关文章

  • Java复式表

    有谁知道可以下载的 Java 中的复式表实现吗 我需要做这样的事情 1 2 3 a x y z b h l m c o a k table get a 1 会回来x 当然 它应该使用任何对象作为键 值等 有两种基本方法 具体取决于您的需求
  • JavaScript 无法解析 Java 中使用 Gson 序列化的字符串[重复]

    这个问题在这里已经有答案了 这不是重复的这个问题 https stackoverflow com q 15637429 274677因为这里的问题具体是关于在 JavaScript 中以文字形式从 Java 序列化的 JSON 字符串的表示
  • 获取 get 或 post 请求的响应的响应字符集

    我正在努力在 java web 应用程序中提取响应字符集 我在其中使用 Apache HTTP 客户端 例如 从 Content Type 标头获得的一个可能值是 text html charset UTF 8 然后我的代码将提取 符号之后
  • 如何测试两个 Joda-Time DateTime 对象几乎相等?

    在单元测试中 我经常使用返回DateTime于或关于now 有没有办法说actual日期时间在几秒之内actual约会时间 这听起来是个坏主意 单元测试不应该以任何方式依赖于当前的实际时间 这就是为什么注入一些接口是一个很好的做法 称为Cl
  • JAX-RS:不区分大小写的路径

    我已将 REST 服务 方法锚定到 URI 模板 Path注解 它看起来像往常一样 GET Path message Produces application json public Response getMessage 但我的 REST
  • 克隆在幕后是如何工作的?

    克隆不会调用对象构造函数来创建对象的副本 那么clone使用什么算法呢 我正在寻找本机方法克隆的实现细节 任何指示将不胜感激 请注意 我知道克隆的缺点 protected native Object clone 我不太清楚 我需要查看本机代
  • Unwrap 当使用 Collectors maxBy 和 groupingBy 时可选

    我有一堂课 有一个String and an int field public class Data private String name private int value private Data String name int va
  • Jenkins 中未找到 Maven

    我正在 Jenkins 中运行我的 Maven Spring 项目 只是第一次测试它 使用 shell 脚本选项 mvn spring boot run 我收到构建错误 Users Shared Jenkins tmp jenkins808
  • Jackson - 将值传递给 JsonDeserializer

    我有一个现有的类层次结构 如下所示 public interface Service String getId String getName public class FooTask extends AbstractTask private
  • Android Edittext Onclick Datepickerdialog 棒棒糖中出现错误

    我正在使用日期选择器对话框 它在 kitkat 上运行正常 但是当我在棒棒糖上运行应用程序时 当我单击编辑文本时 它会打开一个日期选择器对话框 但当我选择日期时 它会不幸地给出停止错误 以下是 edittext 上日期选择器的代码 priv
  • 如何将 csv/文本文件从 Android 手机发送到 WiFi 打印机?

    我正在开发一个 Android 应用程序 我应该从数据库中获取 csv txt 文件格式的数据 然后我必须将文件发送到 wifi 打印机 有谁知道我如何开始这样做 答案终于很简单 Socket client new Socket IP PO
  • Android Widget 实现

    嗨 如果这个问题很愚蠢 我提前道歉 我对 Android 编程相当陌生 而且学得很快 我刚刚创建了一个任务提醒应用程序 并且想将该应用程序转换 实现为一个可以在主屏幕上查看的小部件 有什么方法吗 这可能吗 Thanks 如果没有更多关于您的
  • 我的递归条件是否正确计算二叉树高度?

    我想在你的帮助下知道我的代码是对还是错 因为遗憾的是我无法运行它来检查 没有编译错误 我想做的是找到二叉树的高度 当然 树不必是平衡的 二叉树中的每个节点可以有两个节点作为子节点 http en wikipedia org wiki Bin
  • Java 8 LocalDate Jackson 格式

    For java util Date当我做 JsonFormat shape JsonFormat Shape STRING pattern dd MM yyyy private Date dateOfBirth 然后在我发送时在 JSON
  • 带句点和逗号的自定义格式数字

    有点相关这个问题 https stackoverflow com questions 4738853 java decimal format parse to return double value with specified numbe
  • 获取 javax.crypto.IllegalBlockSizeException:使用填充密码解密时输入长度必须是 16 的倍数?

    使用 tomcat 我有两个 Web 应用程序 即 app1 和 app2 我以加密形式 使用下面的代码 将 url 从 app1 发送到 app2 然后在app2 我解密了这个加密的网址 但我在第 50 行低于异常decryp方法 Get
  • 为什么 CompletableFuture.allOf 声明为 CompletableFuture

    Why is CompletableFuture allOf声明为CompletableFuture
  • Java中C是A的子类时“C c = new C()”和“A c = new C()”的区别

    假设我们有类 A 作为父类 以及扩展它的类 C class A void m System out println A m class C extends A Override void m System out println C m 和
  • JarSplice 的命令行参数?

    罐子接头 http ninjacave com jarsplice允许将 jar 文件以及其他依赖项和库聚合到一个可执行 jar 文件中 但是 我的可执行 jar 需要两个命令行参数 当我调用 JarSplice jar 时 这两个参数似乎
  • 无法声明接口:资源繁忙

    我正在使用 USB4Java 低级版本 并且基本上是根据这段代码工作的here http www mets blog com java usb communication usb4java 我在 Ubuntu 中工作 遇到了有关权限的问题

随机推荐

  • wps插入图片显示不全、混乱

    问题如下 原因 格式混乱 解决办法 1 统一格式 使用格式刷统一文档的格式 2 Ctrl A 全选 重新选择行距 3 重新粘贴图片 选择嵌入型
  • 从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • Grokking the System Design Interview: 如何应对系统设计面试

    拥有良好的系统设计能力 是一个优秀程序员的必要素质 当然更重要的是 越来越多的公司在面试中考察系统设计能力 尤其是外企巨头 如谷歌 亚马逊 微软等 这些公司对于社招的软件工程师往往有这方面的要求 但是系统设计和算法题不一样 它考察的是程序员
  • Unit sshd.service could not be found.

    错误原因 刚安装了Ubuntu18 04系统 用Xshell连接服务器失败 因为服务器没有开启 可被远程连接的功能 指令输入 systemctl status sshd 然后出现了标题上的错误 解决方法 一 检测bug原因 ps e gre
  • 接口自动化入门-TestNg

    目录 1 TestNg介绍 2 TestNG安装 3 TestNG使用 3 1 编写测试用例脚本 3 2 创建TestNG xml文件 1 创建testng xml文件 2 修改testng xml 4 测试报告生成 1 TestNg介绍
  • Flutter悬浮窗组件之实现快捷换肤、切换语言等开发调试功能模块

    一 最近开发一个App具有黑白两个主题和切换语言的功能 所以在开发的时候一个页面总是要不断的去切换主题和语言来查看功能是否正常 为了提高这个开发效率突然想到可以在应用上增加一个悬浮窗组件然后实现主题切换和语言切换的功能 这样在任意一个页面就
  • JavaScript数据结构-树

    文章转自 JavaScript数据结构 树 我觉得这社会上 也不差钱好多人 可能好多人也不差权力 但是我觉得能得到这种满足的也不多 郭小平 lt 临汾红丝带学校校长 gt 树是计算机科学中经常用到的一种数据结构 树是一种非线性的数据结构 以
  • Makefile的两种编译方法——原地编译和单独输出文件夹编译

    1 原地编译 编译代码时默认是原地编译 原地编译就是编译生成的 o文件和相应的 c文件是在同一目录的 原地编译比较简单 但是会污染源码 目录里会多出生成的 o文件 并且编译不同配置的目标文件 都要先清除之前的 o文件 2 单独输出文件夹编译
  • 【Python爬虫与数据分析】爬虫Json数据解析

    目录 一 Json文件数据解析 二 Json数据包解析获取图片资源 三 Json数据包解析获取视频资源 一 Json文件数据解析 json字符串 通常类似python数据类型中的列表和字典的结合 也可能是单独的列表或者字典格式 通常可以通过
  • Win10:修改电脑桌面路径

    Win10 修改电脑桌面路径 1 win R进入运行 输入 regedit 2 进入 注册表编辑器 3 依次打开 HKEY CURRENT USER Software Miscrosoft Windows Explorer Uesr she
  • 腾讯2020校招第一次笔试第1题

    小Q想要给他的朋友发送一个神秘字符串 但是他发现字符串的过于长了 于是小Q 发明了一种压缩算法对字符串中重复的部分进行了压缩 对于字符串中连续的m个相同字 符串S将会压缩为 m S m为一个整数且1 lt m lt 100 例如字符串ABC
  • 如何创建Vue项目

    一 Vue项目构建 1 安装node 简介 Node js并不是我们平常使用的JavaScript库 它是一个JavaScript的运行环境 基于这个环境 我们可以不需要浏览器直接执行js代码 类似于Java的运行环境jdk 安装 官网下载
  • 环境搭建之jetBrains-IDEA安装激活

    1 下载安装程序 2 运行安装程序 3 装完后运行 激活或者破解参考 https blog csdn net justszh article details 81484802 ThisCrackLicenseId licenseId Thi
  • 炒了8年的概念,到底该如何理解DevOps这个词?

    如何实施DevOps成为众多企业迫切面临的问题 本文作者刘相 有10多年的从业经验 他结合自身企业实施DevOps的经验 梳理出DevOps在企业的组织 技术 流程等方面的最佳实践与价值 以及如何搭建DevOps平台来支撑DevOps的落地
  • Windows环境同时安装多个版本的Python解释器(python2和python3)(超详细)

    1 背景描述 众所周知 python当前有两大主流版本 分别是Python2和Python3系列 其中Python3因为对Python2做了较大的优化 使得Python3不会向下兼容 但是工作和学习中 有很多项目需要Python2的环境 有
  • Unity使用UnityWebRequest请求服务器json数据,webgl端服务器请求

    根据unity官方说的 WebGL 网络无法直接访问套接字 由于存在安全隐患 JavaScript 代码无法直接访问 IP 套接字来实现网络连接 因此 NET 网络类 即 System Net 命名空间中的所有内容 具体而言就是 Syste
  • error_80051,source size 2780KB exceed max limit 2MB [时间][appid]

    error 80051 source size 2780KB exceed max limit 2MB 时间 appid 微信小程序预览报错 message Error 系统错误 错误码 80051 source size 2780KB e
  • Docker之容器退出(实战)

    docker实战 一 centos7 yum安装docker docker实战 二 基础命令篇 docker实战 三 docker网络模式 超详细 docker实战 四 docker架构原理 docker实战 五 docker镜像及仓库配置
  • 好用的资源推荐

    前端 扁平化前端css框架 materializecss 很喜欢里面的组件和javascript的调用方式 简单易用多组件好看的css框架 semantic ui 简单好看的基于jquery的消息提示框 CodeSeven toastr 好
  • Java小技巧:避免缓存,Java动态加载配置文件

    Java动态加载配置文件 关键 每次读取都要重新生成流 今天无意间在项目的代码中看到如下这样一段简单加载配置文件的代码 Properties prop new Properties InputStream in PropertiesTest