1、引言
java开发中,经常需要读取配置文件,有时即使我们方法是对的,但是就是读取不到需要的内容,会报下面的错:
java.io.FileNotFoundException: sr/configure/config.properties (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at com.test.properties.TestProperties.getProperties_2(TestProperties.java:118)
at com.test.properties.TestProperties.main(TestProperties.java:253)
或者这个错:
Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:434)
at java.util.Properties.load0(Properties.java:353)
at java.util.Properties.load(Properties.java:341)
at com.test.properties.TestProperties.getProperties_3(TestProperties.java:174)
at com.test.properties.TestProperties.main(TestProperties.java:258)
等等。
2、几种读取方式
2.1 基于ClassLoder读取配置文件
Properties properties = new Properties();
// 使用ClassLoader加载properties配置文件生成对应的输入流
InputStream in = PropertiesMain.class.getClassLoader().getResourceAsStream("config/config.properties");
// 使用properties对象加载输入流
properties.load(in);
//获取key对应的value值
properties.getProperty(String key);
注意: 该方式只能读取类路径下的配置文件,有局限但是如果配置文件在类路径下比较方便。
2.2 基于 InputStream 读取配置文件
Properties properties = new Properties();
// 使用InPutStream流读取properties文件
BufferedReader bufferedReader = new BufferedReader(new FileReader("E:/config.properties"));
properties.load(bufferedReader);
// 获取key对应的value值
properties.getProperty(String key);
注意: 该方式的优点在于可以读取任意路径下的配置文件
2.3 通过 java.util.ResourceBundle 类来读取,这种方式比使用 Properties 要方便一些
通过 ResourceBundle.getBundle() 静态方法来获取(ResourceBundle是一个抽象类),这种方式来获取properties属性文件不需要加.properties后缀名,只需要文件名即可
//config为属性文件名,放在包com.test.config下,如果是放在src下,直接用config即可
ResourceBundle resource = ResourceBundle.getBundle("com/test/config/config");
String value = resource.getString("key");