文档章节

java读取properties文件方法

s
 sunsyu
发布于 2017/04/13 16:06
字数 931
阅读 5
收藏 0

简介

    我们在做一些Java应用开发的时候,会将很多环境特定的变量定义到一个配置文件中。比较常见的定义文件有xml, properties,甚至txt等格式的。在Java里有一个类似于标准配置格式的文件,就是.properties类型的文件。它主要用来存储一些名值对的内容,里面的内容都存成如propertyname=propertyvalue这种样式。读取properties文件的方法有很多种,网上也有大量的说明,这里主要针对两种典型的方式做一个对比。

问题场景

    现在假定我们有一个config.properties的文件,里面存有如下的内容信息:

Java代码   
  1. dbpassword=password  
  2. database=localhost  
  3. dbuser=user  

     我们希望通过程序来读取它的内容。

    粗粗一看,这问题实在是太简单了,且看我们的第一个方法:

File IO

    我们可以直接通过File Stream的经典方式来读文件,然后解析一把出来不就可以了么?这种实现的代码如下::

Java代码   
  1. import java.io.FileInputStream;  
  2. import java.io.IOException;  
  3. import java.util.Properties;  
  4.   
  5. public class App {  
  6.     public static void main(String[] args) {  
  7.         Properties prop = new Properties();  
  8.           
  9.         try {  
  10.             prop.load(new FileInputStream("config/config.properties"));  
  11.               
  12.             System.out.println(prop.getProperty("database"));  
  13.             System.out.println(prop.getProperty("dbuser"));  
  14.             System.out.println(prop.getProperty("dbpassword"));  
  15.         } catch(IOException e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  
  19. }  

     这部分代码几乎没什么可说的,就是通过创建一个java.util.Properties的对象,然后在指定properties文件之后通过FileInputStream读取它,将这个InputStream作为参数传给properties对象。properties对象的load方法就把结果解析出来了。我们执行它之后就会看到一个如下的结果:

Java代码   
  1. localhost  
  2. user  
  3. password  

     还有一个要注意的地方就是,我们在传递给FileInputStream的路径是当前的相对路径,也就是说我们必须把config.properties文件放到我class文件所在目录的一个config字目录下。

    现在,在考虑其他方式之前,我们看看FileInputStream这种方式的特点。我们读取properties文件的时候必须要知道它所在的路径。采用FileInputStream的时候我们必须将文件的路径传递给程序。否则程序找不到文件后会出现异常。考虑到我们的程序很多时候是编译后要部署到不同的生产环境的,如果每个环境不一样,难道我们每次都要来修改这个程序吗?或者说我们将配置文件所在的路径还要作为一个参数传给程序?这两种方式很明显不太合适。那么有没有什么法子比如说我不需要修改程序或者刻意传参数给程序就搞定了呢?另外一种方法可以达到这个理想的结果。

classloader

    采用classloader的方式主要是通过它的getResourceAsStream方法来实现加载properties文件。具体细节我们可以看如下的示例:

Java代码   
  1. import java.io.FileInputStream;  
  2. import java.io.IOException;  
  3. import java.util.Properties;  
  4.   
  5. public class NewApp {  
  6.     public static void main(String[] args) {  
  7.         Properties prop = new Properties();  
  8.           
  9.         try {  
  10.             prop.load(NewApp.class.getClassLoader().getResourceAsStream("config.properties"));  
  11.               
  12.             System.out.println(prop.getProperty("database"));  
  13.             System.out.println(prop.getProperty("dbuser"));  
  14.             System.out.println(prop.getProperty("dbpassword"));  
  15.         } catch(IOException e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  
  19. }  

     这里我们并没有指定一个特定的路径给classloader,我们只是将文件名直接传给了它。如果我们将config.properties文件和class文件放在同一个目录下,结果运行正常。如果我们将properties放到其他地方则会碰到错误:

要注意的问题:

    若该类的存放路径是D:\com\file\FileUtility.java

              包名:package com.file ;

    属性文件的路径问题—

★若传递的文件名是“test.property”,则text. Property文件应该放在D:\com\file目录下;

★若传递的文件名是“/test.property”,则text. Property文件应该放在D:\目录下


© 著作权归作者所有

s
粉丝 0
博文 109
码字总数 135924
作品 0
深圳
私信 提问
从读取properties文件说开去,浅谈web容器中类加载器

今天刚好有人让我写个通过读取properties连接数据库的小demo. 汗啊,普通项目中可以使用的文件读取,在web项目中总报空指针异常. 查阅了资料明白,赶紧记录下来,希望遇到此类问题的童鞋能引起重...

jeffsui
2012/10/31
0
10
Java Web的Maven项目中Properties文件的使用

背景 我需要在配置文件中设置一些参数,然后在代码中获取数据使用。我的配置文件放在了src/main/resources文件夹下面了。 思路 主要是通过当前类加载器,通过加载resources资源文件为流,然后...

亚林瓜子
2018/08/03
0
0
java基础专栏—Properties

Properties 一个持久的属性集。Properties可以保存在流中或从流中加载,Map中每个键和值都对应字符串 HashTable的子类,Map集合的方法都可以使用,线程安全 该集合没有泛型,且不能写泛型 它...

T-newcomer
2017/10/21
0
0
linux中,运行java程序装载linux指定目录下的Properties文件

在linux脚本中,指定应用的properties文件,调用java应用去读取properties文件 linux脚本: --------------- export CFG_ROOT=/a/b/c/app.properties export JAVACMD=$JAVAHOME/bin/java exp......

月下独酌100
2012/08/28
0
0
maven打jar包,配置文件没有被打入

今天在给common项目打包的过程中,发现打出的包中(jar文件)不包含.properties文件,我们项目在读取一些配置时,把信息写在了weifutong.properties 文件中,地址为:XXX_common/src/main/j...

小学生学习
2018/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?

轻松筹首创了“大病救助”模式,帮助了众多病患在第一时间解決了医疗资金等问题,为了从源头解决了医疗资金问题。而在轻松筹这样全球5.5亿用户信赖的大病筹款平台的背后,是日益增长的各种数...

阿里云云栖社区
5分钟前
1
0
Confluence 6 在升级过程中查看合并日志

为了监控升级的过程,你应该查看 application log 日志中的输出。 通常日志经常将会显示多个日志实例,这个实例是定义在日志的 INFO 级别的,通常格式如下: WikiToXhtmlMigrationThread-n -...

honeymoose
5分钟前
0
0
git diff 文件对比

git diff filepath 工作区与暂存区比较 git diff HEAD filepath 工作区与HEAD ( 当前工作分支) 比较 git diff --staged 或 --cached filepath 暂存区与HEAD比较 git diff branchName filepa......

李佳顺
6分钟前
0
0
spring mvc 定制化配置

spring mvc 自定义配置 1.实现某些接口,然后让上面的类加载进去. class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean......

最爱肉肉
8分钟前
0
0
OSG_采样像机的内容如果不显示到窗口上

cameraLight->setRenderTargetImplementation(Camera::FRAME_BUFFER_OBJECT);// 这句使内容不渲染到屏幕上cameraLight->setRenderOrder(Camera::PRE_RENDER); 1.setRenderTargetImplement......

洛克人杰洛
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部