Java获取项目资源的两种方式
在增加了连接池功能后,SORM简易框架的学习快到尾声。这时需要整理项目结构,清除掉之前为了测试而临时写的一些类和包。这时前面搁置的一个关于获取项目资源方式问题就需要解决了。
项目的结构如下:
MYORM
├── out
│ └── production
│ └── MYORM //编译后项目的ClassPath
│ ├── po
│ │ ├── Dept.class
│ │ └── Emp.class
│ └── sorm
│ ├── bean
│ │ ├── ColumnInfo.class
│ │ ├── Configuration.class
│ │ ├── JavaFieldGetSet.class
│ │ └── TableInfo.class
│ ├── core
│ │ ├── Callback.class
│ │ ├── DBManager.class
│ │ ├── MySqlQuery.class
│ │ ├── MySqlTypeConverter.class
│ │ ├── Query$1.class
│ │ ├── Query$2.class
│ │ ├── Query.class
│ │ ├── QueryFactory.class
│ │ ├── TableContext.class
│ │ └── TypeConverter.class
│ ├── db.properties //要加载的资源文件
│ ├── pool
│ │ └── DBConnPool.class
│ └── utils
│ ├── JavaFileUtils.class
│ ├── JDBCUtils.class
│ ├── ReflectUtils.class
│ └── StringUtil.class
└── src
├── po //根据测试数据库生成的Javabean,需要删除
│ ├── Dept.java
│ └── Emp.java
└── sorm
├── bean
│ ├── ColumnInfo.java
│ ├── Configuration.java
│ ├── JavaFieldGetSet.java
│ └── TableInfo.java
├── core
│ ├── Callback.java
│ ├── DBManager.java
│ ├── MySqlQuery.java
│ ├── MySqlTypeConverter.java
│ ├── QueryFactory.java
│ ├── Query.java
│ ├── TableContext.java
│ └── TypeConverter.java
├── db.properties
├── pool
│ └── DBConnPool.java
└── utils
├── JavaFileUtils.java
├── JDBCUtils.java
├── ReflectUtils.java
└── StringUtil.java
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
资源文件db.properties
存放在sorm包中,之前一直都是在sorm包下建一个空类Main,使用:
properties.load(Main.class.getResourceAsStream("db.properties"));
来将配置加载到Properties对象中。然而专门使用一个类来标记包内的资源文件是没有必要的。下面给出我了解到的两种获取项目资源文件的方法。
# 使用类对象
类对象可直接由类名或类的实例得到,以MySqlQuery为例:
URL url1 = MySqlQuery.class.getResource("1.txt");
MySqlQuery query = QueryFactory.createQuery();
URL url2 = query.getClass().getResource("1.txt");
2
3
4
使用类对象的getResource()方法得到的是一个java.net.URL对象,可以进一步调用openStream()和getFile()等方法。
值得注意的是调用类对象的getResource(String path)
方法传入的路径,如果不以斜线/
开头则使用的相对路径为该类所在的包;如果以斜线/
开头则使用的相对路径为项目编译后的ClassPath即out/production/ProjectName
,与源文件src下的包结构对应。
//该类的包路径
URL url1 = MySqlQuery.class.getResource("");
//打印url1的结果 file:/C:/Users/Wallace/IdeaProjects/MYORM/out/production/MYORM/core/
//该类包下的一个文件(文件不存在)
URL url2 = MySqlQuery.class.getResource("db.properties");
//打印url2的结果 file:/C:/Users/Wallace/IdeaProjects/MYORM/out/production/MYORM/core/db.properties
//项目ClassPath下的资源文件
URL url3 = MySqlQuery.class.getResource("/sorm/db.properties");
//打印url3的结果 file:/C:/Users/Wallace/IdeaProjects/MYORM/out/production/MYORM/sorm/db.properties
2
3
4
5
6
7
8
9
10
11
# 使用类加载器
//类加载器对象也可以由类对象得到: query.getClass().getClassLoader();
URL url4 = Thread.currentThread().getContextClassLoader().getResource("sorm/db.properties");
//打印url4的结果 file:/C:/Users/Wallace/IdeaProjects/MYORM/out/production/MYORM/sorm/db.properties
2
3
使用类加载器的getResource()方法时和使用类对象的getResource()方法时传入的Path有所不同,不能以斜线/
开头,默认就是从ClassPath根下获取。如果以斜线开头,则返回的是Bootstrap ClassLoader的加载范围,为null
。
类对象和类加载器对象都提供了getResource()
和getResourceAsStream()
方法,不论是使用类对象还是使用类加载器,getResourceAsStream()
和getResource().openStream()
是等效的,都是将资源作为输入流来进行访问。以文件为输入流读取的是文件的内容,以文件夹为输入流读取的是文件夹中所有的文件(夹)名。