(转)java getResourceAsStream的使用方法
背景:对于java项目中配置文件加载时候的绝对路径和相对路径做一个清晰的认识!
1 分析路径
在Java项目中会经常用到getResourceAsStream这个函数获取一些配置文件,但是怎样正确使用这个函数呢?
1.1 熟悉根目录结构
getResourceAsStream(String path)这个函数的参数是一个路径,但是这个路径应该怎么填?使用该函数的难点也就在此。
其实只要记住一个关键点,getResourceAsStream这个函数寻找文件的起点是JAVA项目编译之后的根目录,比如一般maven项目编译之后根目录都是target/classes这个文件,举个例子,比如下面这个目录树就是一个maven项目编译之后的文件分布情况:
.
├── auth.server.properties
├── com
│ ├── winwill
│ │ └── test
│ │ ├── TestConstants.class
│ │ ├── TestConstants$HOST.class
│ │ ├── TestGetResourceAsStream.class
│ │ └── TestGuava.class
│ └── xiaomi
│ └── xmpush
│ └── iOS
│ ├── IOSPushTest.class
│ ├── UploadCertificate$1.class
│ └── UploadCertificate.class
├── config
│ └── config2.properties
├── config.properties
├── kafka-consumer.properties
├── kafka-producer.properties
├── META-INF
│ ├── MANIFEST.MF
│ └── maven
│ └── com.winwill.test
│ └── test
│ ├── pom.properties
│ └── pom.xml
├── Redis.properties
└── zookeeper.properties
我们在TestGetResourceAsStream.class这个类中应该怎么获取config.properties和config2.properties这两个文件呢?
ps:要想查看项目的根目录结构,可以直接查看项目所在目录下的classes文件目录。例如下面的项目不属于maven项目
项目结构:

编译后的根目录结构:

1.2 使用getClass().getResourceAsStream(String path)
ps: path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。
从上面的目录树可以看到,config这个文件的路径是/config.properties(/表示根目录),config2.properties这个文件的路径是/config/config2.properties,
所以我们可以使用下面的代码获取这两个文件——从根下获取资源
package com.winwill.test; import org.junit.Test; import java.io.IOException;
import java.io.InputStream; /**
* Created by qifuguang on 14-9-28.
*/
public class TestGetResourceAsStream {
@Test
public void getResourceClassAndFileInSamePackage() throws IOException {
// 获取config2.properties
InputStream config2 = this.getClass().getResourceAsStream("/config/config2.properties"); // 获取config.properties
InputStream config = this.getClass().getResourceAsStream("/config.properties");
}
}
上面的代码使用的是从根目录开始的绝对路径。
那么可不可以使用相对路径呢?当然可以,请看下面的代码——从类所在的包下获取资源
package com.winwill.test; import org.junit.Test; import java.io.IOException;
import java.io.InputStream; /**
* Created by qifuguang on 14-9-28.
*/
public class TestGetResourceAsStream {
@Test
public void getResourceClassAndFileInSamePackage() throws IOException {
// 获取config2.properties
InputStream config2 = this.getClass().getResourceAsStream("../../../config/config2.properties"); // 获取config.properties
InputStream config = this.getClass().getResourceAsStream("../../../config.properties");
System.out.println(config + " " + config2);
}
}
代码中的两个路径就是这两个文件相对TestGetResourceAsStream.class这个文件的的相对路径。
1.3 使用getClass().getClassLoader().getResourceAsStream(String path)
ps:默认是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
getClass().getClassLoader().getResourceAsStream()默认使用的路径就是class文件的根目录,所以使用getClass().getClassLoader().getResourceAsStream()来获取文件的时候不能在路径前面加上/,于是我们可以这样获取这两个文件:
package com.winwill.test; import org.junit.Test; import java.io.IOException;
import java.io.InputStream; /**
* Created by qifuguang on 14-9-28.
*/
public class TestGetResourceAsStream {
@Test
public void getResourceClassAndFileInSamePackage() throws IOException {
// 获取config2.properties
InputStream config2 = this.getClass().getClassLoader().getResourceAsStream("config/config2.properties"); // 获取config.properties
InputStream config = this.getClass().getClassLoader().getResourceAsStream("config.properties");
}
}
1.4 WebAPP根目录下取资源
ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。
Jsp下的application内置对象就是上面的ServletContext的一种实现。
(转)java getResourceAsStream的使用方法的更多相关文章
- 原生java调用webservice的方法,不用生成客户端代码
原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...
- 获取当前应用的系统路径工具类和java的System.getProperty()方法介绍
java的System.getProperty()方法可以获取的值,如下: 对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? /** ...
- Java实现时间动态显示方法汇总
这篇文章主要介绍了Java实现时间动态显示方法汇总,很实用的功能,需要的朋友可以参考下 本文所述实例可以实现Java在界面上动态的显示时间.具体实现方法汇总如下: 1.方法一 用TimerTask: ...
- Java Native Interfce三在JNI中使用Java类的普通方法与变量
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...
- 浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- 0019 Java学习笔记-面向对象-方法
方法属于谁 方法要么属于类,要么属于对象 static修饰的方法属于类 没有static修饰的方法属于对象 方法只能定义在类里面,不能独立定义 不能独立的执行方法,要么通过类调用,要么通过方法调用 一 ...
- [Java] - 格式字符串替换方法
Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...
- atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug
atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug 1. core.setProperty(o, "materialId&qu ...
- JAVA常见错误处理方法 和 JVM内存结构
OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...
随机推荐
- [朴孝敏][Road Trip]
歌词来源:http://music.163.com/#/song?id=406907305 作曲 : Ryan S. Jhun/G'harah 'PK' Degeddingseze/Denzil Re ...
- Shell 字符串处理、获取文件名和后缀名
http://blog.csdn.net/guojin08/article/details/38704823
- CentOS6安装与运行R脚本
http://blog.csdn.net/bdchome/article/details/47811763
- 第九次作业psp
psp 进度条 代码累积折线图 博文累积折线图 psp饼状图
- js为一个对象Object添加一个新的属性和值
1, var obj = {}; //或者 var obj=new Object(); var key = "name"; var value = "张三丰" ...
- Leetcode题库——6.Z字形变换
@author: ZZQ @software: PyCharm @file: convert.py @time: 2018/9/20 20:12 要求: Z字形变换 将字符串 "PAYPAL ...
- 牛客网国庆集训派对Day5 题目 2018年
链接:https://www.nowcoder.com/acm/contest/205/L来源:牛客网参考博客:https://blog.csdn.net/HTallperson/article/de ...
- 蜗牛慢慢爬 LeetCode 9. Palindrome Number [Difficulty: Easy]
题目 Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could nega ...
- 『编程题全队』Alpha 阶段冲刺博客Day1
『编程题全队』Alpha 阶段冲刺博客Day1 一.Alpha 阶段全组总任务 二.各个成员在 Alpha 阶段认领的任务 三.明日各个成员的任务安排 孙志威:实现基本的网络连接, 完成燃尽图模块 孙 ...
- python 安装pymssql
error: command 'gcc' failed with exit status 1 ---------------------------------------- Command &quo ...