java 读取资源文件最详细解读
来源:互联网 发布:海外淘宝网 编辑:程序博客网 时间:2024/06/11 00:21
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节点里做上面的配置,也能达到上面同样的效果!
- java 读取资源文件最详细解读
- java读取资源文件
- java读取资源文件:
- java读取资源文件
- Java资源文件读取
- java读取资源文件
- Java 读取资源文件
- java读取资源文件
- java读取资源文件
- Java读取资源文件
- Java资源文件读取
- java中读取资源文件
- java程序读取资源文件
- java读取项目资源文件
- 依赖注入最详细解读
- java读取资源文件--使用文件流的方式读取
- java应用程序读取中文资源文件
- java.util.Properties 读取资源文件
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- 学习淘淘商城第四十五课(使用SolrJ查询索引库)
- 优化后的冒泡排序(Bubble Sort)
- 准备做个Ftp自动更新的程序,提前做下准备
- 【AHOI2013】bzoj3238 差异
- java 读取资源文件最详细解读
- 192_IO流_BufferedReader_接收用户键盘输入
- pip install 出现Exception
- 蓝牙会干掉Zigbee吗?
- 第2章 基本程序设计
- URL get传参中文乱码
- Android Studio gradle 编译提示‘default not found’ 解决办法
- DatabaseConnectionPool--数据库连接池
- Java学习笔记(十)--集合 List集合