资源文件可以看成是配置文件,一般的形式有两种:properties形式和XML形式 路径:一般是写在src目录下面,根目录
properties文件中数据的存储是以键值对的形式存在,每一行为一条数据,只能存储字符串形式的数据
Map==>Propertis
String key -- String value
那么我们如何去读取资源文件里面的内容呢??? (下面三种方式主要集中在流的获取上)
方式一 ==》传统IO流方式:使用JDK中的Properties类进行数据读取
①:创建Properties对象
②:load加载资源文件流
③:读取数据:getProperty(key):返回资源文件中对应key中的值(字符串),若key不存在则返回null
方式二 ==》字节码对象获取流 注意:文件最终必须被编译到class文件存放的位置
①:创建Properties对象
②:通过字节码文件获得资源 (注意:字节码文件 加载流资源,前必须带/,若资源文件没有在包中,包的路径可以省略) 类名.class.getResourceAsStream(/包路径/文件名)
②:load加载资源文件流
③:读取数据:getProperty(key):返回资源文件中对应key中的值(字符串),若key不存在则返回null
方式三 ==》类加载器获取流 (采取通过线程获得类加载器)
①:创建Properties对象
②:通过当前类的字节码文件得到一个类加载器 类名.class.getClassLoader()
通过线程获得类加载器 Thread.currentThread().getContextClassLoader()
③:用类加载器加载流资源
④:load加载资源文件流
⑤:读取数据:getProperty(key):返回资源文件中对应key中的值(字符串),若key不存在则返回null
注意:方式一流资源文件路径是写死的 存在隐编码问题 不推荐使用!
推荐使用方式三中的线程获取类加载器 读取配置文件!!!
ex1:传统IO流方式:使用JDK中的Properties类进行数据读取
public class TestProperties {
public static void main(String[] args) throws IOException {
testReadProperties1();
}
//传统IO流方式:使用JDK中的Properties类进行数据读取
public static void testReadProperties1() throws IOException {
//①创建Properties对象:用于读取文件
Properties properties = new Properties();
//②创建一个流资源关联磁盘文件(这里使用的是绝对路径)读取配置信息,流资源定位需要绝对路径!!
FileInputStream fis = new FileInputStream("E:/eclipse-workspace/JavaEE_workspace/Day32_JavaBasic/src/db.properties");
//③properties加载资源文件流
properties.load(fis);
//④读取数据:getProperty(key):返回资源文件中对应key中的值(字符串),若key不存在则返回null
System.out.println(properties.getProperty("username"));//root
System.out.println(properties.getProperty("password"));//1
System.out.println(properties.getProperty("notexits"));//null
}
}
运行结果图:
ex2: 字节码对象获取流
public class TestProperties {
public static void main(String[] args) throws IOException {
testReadProperties2();
}
// 第二种方式:字节码对象获取流
public static void testReadProperties2() throws IOException {
//①创建Properties对象:用于读取文件
Properties properties = new Properties();
//②通过字节码文件,获得资源
//注意:字节码文件 加载流资源,前必须带/,若资源文件没有在包中,包的路径可以省略
InputStream is = TestProperties.class.getResourceAsStream("/db.properties");
// 配置文件写在包路径下面
//InputStream is = TestProperties.class.getResourceAsStream("/com/zhengqing/Demo/db.properties");
//③properties加载资源文件流
properties.load(is);
//④读取数据:getProperty(key):返回资源文件中对应key中的值(字符串),若key不存在则返回null
System.out.println(properties.getProperty("username"));// root
System.out.println(properties.getProperty("password"));// 1
System.out.println(properties.getProperty("notexits"));// null
}
}
ex3:类加载器获取流 ==》通过当前类的字节码文件得到一个类加载器
public class TestProperties {
public static void main(String[] args) throws IOException {
testReadProperties3();
}
// 第三种方式:类加载器获取流 ==》通过当前类的字节码文件得到一个类加载器
public static void testReadProperties3() throws IOException {
// ①创建Properties对象:用于读取文件
Properties properties = new Properties();
// ②当前类的字节码文件==>得到一个类加载器【注意:当前类名如果改了,意味着下面的类名必须改!!】
ClassLoader classLoader = TestProperties.class.getClassLoader();
// ③用类加载器加载流资源 [如下,写的路径是项目的相对路径,如果该资源文件不存在,会出现硬编码问题]
// 资源文件在src目录下面 写路径:类加载器 路径不需要写/
InputStream is = classLoader.getResourceAsStream("db.properties");
// 资源文件在包路径下面 写路径:包路径/子包路径/子包路径...../资源文件的名字
//InputStream is = classLoader.getResourceAsStream("com/zhengqing/Demo/db.properties");
// ④properties加载流资源
properties.load(is);
// ⑤读取数据:getProperty(key):返回资源文件中对应key中的值(字符串),若key不存在则返回null
System.out.println(properties.getProperty("username"));// root
System.out.println(properties.getProperty("password"));// 1
System.out.println(properties.getProperty("notexits"));// null
}
}
ex3:类加载器获取流
public class TestProperties {
public static void main(String[] args) throws IOException {
testReadProperties4();
}
// 第三种方式:类加载器获取流 ==>通过线程获得类加载器
public static void testReadProperties4() throws IOException {
// ①创建Properties对象:用于读取文件
Properties properties = new Properties();
// ②通过线程获得类加载器
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
// ③类加载器获得获得流资源
// 资源文件在src目录下面:直接写文件路径 不需要/ 如果写在其他的包路径==》包路径/子包路径/子包路径...../资源文件的名字
InputStream is = contextClassLoader.getResourceAsStream("db.properties");
//InputStream is = contextClassLoader.getResourceAsStream("com/zhengqing/Demo/db.properties");
// ④properties加载流资源
properties.load(is);
// ⑤读取数据:getProperty(key):返回资源文件中对应key中的值(字符串),若key不存在则返回null
System.out.println(properties.getProperty("username"));// root
System.out.println(properties.getProperty("password"));// 1
System.out.println(properties.getProperty("notexits"));// null
}
}