Java项目读取配置文件方式小结

Java项目读取配置文件方式小结

java项目中,经常需要将资源文件打包放在项目中,然后在项目中去读取对应的文件。

一、在Servlet类中读取

假如要将文件获取为流,有两种读取方式:

(1)直接读取文件为流,getResourceAsStream(path)方法,path默认为应用的根目录

1
InputStream inputStream =this.getServletContext().getResourceAsStream("/WEB-INF/classes/error.xml");

(2)先读取文件,再读取为流,获取路径的方式和上面是类似的

1
2
3
String path =this.getServletContext().getRealPath("/WEB-INF/classes/error.xml");

InputStream inputStream = newFileInputStream(path);

二、在非Servlet类中(普通Java类中)的读取

以下面的一个项目为例,项目的目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
├── conf

│ └── krb5.conf

├── pom.xml

├── src

│ ├── main

│ │ ├── java

│ │ ├── resources

│ │ ├── thrift

│ │ └── thrift-java

│ └── test

│ └── java

└── thriftdemo.iml

这是一个maven项目,maven项目默认的结构中,resource位于main目录下面。现在我们希望读取到外面conf目录下的krb5.conf配置文件,该怎么办呢。

为了达到读取并解析krb5.conf的目的,我们首先写了一段简单的测试代码。

1
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
@Test

publicvoidt1() {

String path =Demo.class.getClassLoader().getResource("").getPath();

System.out.println(path);

String filestr = path + "/conf/krb5.conf";

try {

BufferedReader br = new BufferedReader(new FileReader(newFile(filestr)));

while(br.readLine() != null) {

System.out.println(br.readLine());

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

对于这段代码,首先我们需要清楚的一点是:ClassLoader.getResource方法的入参必须是从根目录开始查找,这里根目录就是target里的classes!

如果我们代码正常运行起来以后,打印出来的路径为:

1
/xxx/.../target/classes/

在使用ClassLoader.getResource的时候,注意查找必须是基于根目录,例如在Intellij中就是target/classes。并且目录结构也需要写对,不能以”/”开头。

如果我们不使用ClassLoader.getResource的方式,而是用Class.getResource的方法,也能定位到资源文件。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test

public void t2() {

String path = Demo1.class.getResource("").getPath();

System.out.println(path);

String path2 = Demo1.class.getResource("/").getPath();

System.out.println(path2);

}

看一下代码的输出结果:

1
2
3
/xxx/.../target/classes/edu/bit/files/

/xxx/.../target/classes/

需要注意的就是,如果使用Class.getResource方法,入参为空的时候,是当前.class文件的路径;而当入参为”/”的时候,是从根目录开始查找!

我们希望最终打包的结果为如下的结构:

1
2
3
4
5
6
7
8
9
10
11
classes/

├── conf

│ └── krb5.conf

├── demo.thrift

└── edu

└── bit

构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。
src/main/java和src/test/java
这两个目录中的所有/*.java文件会分别在comile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉。
src/main/resouces和src/test/resources
这两个目录中的文件也会分别被复制到target/classes和target/test-classes目录中。
target/classes
打包插件默认会把这个目录中的所有内容打入到jar包或者war包中。
我们现在想把conf下的kbr5.conf放在conf路径下,这就需要我们在pom.xml中进行一些自定义的配置了。主要有两种方式,下面我们来一一介绍。

1
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
<plugin>

<artifactId>maven-resources-plugin</artifactId>

<version>2.5</version>

<executions>

<execution>

<id>copy-conf</id>

<phase>process-sources</phase>

<goals>

<goal>copy-resources</goal>

</goals>

<configuration>

<outputDirectory>${basedir}/target/classes/conf</outputDirectory>

<resources>

<resource>

<directory>${project.basedir}/conf</directory>

<includes>

<include>**/*.xml</include>

<include>**/*.conf</include>

</includes>

</resource>

</resources>

</configuration>

</execution>

</executions>

</plugin>

其中,directory标签配置的是resource文件的源路径,outputDirectory配置的是resource文件的输出路径。因为我们想将资源文件放置在classes的conf目录下面,所以按照上面的配置方式即可。

1
2
3
4
5
6
7
8
9
10
11
<resources>

<resource>

<directory>${basedir}/conf</directory>

<targetPath>${basedir}/target/classes/conf</targetPath>

</resource>

</resources>

在resources节点里做上面的配置,也能达到上面同样的效果!


本作品采用知识共享署名 4.0 中国大陆许可协议进行许可,欢迎转载,但转载请注明来自御前提笔小书童,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:https://royalscholar.cn/2018/06/08/Java项目读取配置文件方式小结/

# JAVA

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×