java 读取资源文件最详细解读

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

java项目中,经常需要将资源文件打包放在项目中,然后在项目中去读取对应的文件。以下面的一个项目为例,项目的目录结构如下:

├── conf
│   └── krb5.conf
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   ├── resources
│   │   ├── thrift
│   │   └── thrift-java
│   └── test
│       └── java
└── thriftdemo.iml

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

1.使用ClassLoader.getResource定位资源文件

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

    @Test
    public void t1() {
        String path = Demo.class.getClassLoader().getResource("").getPath();
        System.out.println(path);
        String filestr = path + "/conf/krb5.conf";
        try {
            BufferedReader br = new BufferedReader(new FileReader(new File(filestr)));
            while(br.readLine() != null) {
                System.out.println(br.readLine());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

对于这段代码,首先我们需要清楚的一点是:ClassLoader.getResource方法的入参必须是从根目录开始查找,这里根目录就是target里的classes!
如果我们代码正常运行起来以后,打印出来的路径为:

/xxx/.../target/classes/

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

2.Class.getResource也能定位资源文件

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

    @Test
    public void t2() {
        String path = Demo1.class.getResource("").getPath();
        System.out.println(path);
        String path2 = Demo1.class.getResource("/").getPath();
        System.out.println(path2);
    }

看一下代码的输出结果:

/xxx/.../target/classes/edu/bit/files/
/xxx/.../target/classes/

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

3.maven中资源文件的配置

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

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中进行一些自定义的配置了。主要有两种方式,下面我们来一一介绍。

4.在pom.xml的build的plugins子元素中配置maven-resources-plugin插件。

            <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目录下面,所以按照上面的配置方式即可。

5.配置resources节点

        <resources>
            <resource>
                <directory>${basedir}/conf</directory>
                <targetPath>${basedir}/target/classes/conf</targetPath>
            </resource>
        </resources>

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

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值