(转)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 ...
随机推荐
- Streamr助你掌控自己的数据(2)——三种整合数据至Streamr的典型场景
博客说明 所有刊发内容均可转载但是需要注明出处. 三种整合数据至Streamr的典型场景 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数 ...
- linux后台启动程序脚本实例
启动安装的zookeeper和kafka #!/bin/bash # start zookeeper and kafka service echo "========== Start the ...
- css修改input自动提示的黄色背景
css修改input自动提示的黄色背景 input:-webkit-autofill { background-color: #FAFFBD; background-image: none; -web ...
- Linux下lshw,lsscsi,lscpu,lsusb,lsblk硬件查看命令
Linux下lshw,lsscsi,lscpu,lsusb,lsblk硬件查看命令 2016-12-14 何敏杰 1条评论 544次浏览 注意:如有提示命令找不到command not found ...
- 对cnblogs.com的用户体验
1.你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我们是计算机专业学生,是奔向神奇的代码世界的旅人.希望在cnblogs上找到自己感兴趣的技术,并学到更多的知识,提升自己的 ...
- Java操作百度身份证API
网址:http://apistore.baidu.com/ 点击功能进行复制代码,就拿百度的身份证API 举例子: http://apistore.baidu.com/apiworks/service ...
- 从微信SDK看ProtoBuffer文件的生成
前言 Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储等领域的语言无 ...
- sqlserver trigger(触发器)-更新某几列数据时触发【转】
CREATE TRIGGER [dbo].[updataAlarmLevel]ON [dbo].[Alarm_Alarm_Info]AFTER INSERT, UPDATE – 在更新和插入之后ASB ...
- node path模块
一.在nodejs中path模块时使用频率很高的模块,其中不乏有很多API写得很模糊,但仔细琢磨下来,也不是很难理解. 1.获取文件所在路径 var path = require('path'); v ...
- call()方法和apply()方法
最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧. 1. 每个函数都包含两个非继承而来的方法 ...