背景:对于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的使用方法的更多相关文章

  1. 原生java调用webservice的方法,不用生成客户端代码

    原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...

  2. 获取当前应用的系统路径工具类和java的System.getProperty()方法介绍

    java的System.getProperty()方法可以获取的值,如下: 对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? /** ...

  3. Java实现时间动态显示方法汇总

    这篇文章主要介绍了Java实现时间动态显示方法汇总,很实用的功能,需要的朋友可以参考下 本文所述实例可以实现Java在界面上动态的显示时间.具体实现方法汇总如下: 1.方法一 用TimerTask: ...

  4. Java Native Interfce三在JNI中使用Java类的普通方法与变量

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...

  5. 浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  6. 0019 Java学习笔记-面向对象-方法

    方法属于谁 方法要么属于类,要么属于对象 static修饰的方法属于类 没有static修饰的方法属于对象 方法只能定义在类里面,不能独立定义 不能独立的执行方法,要么通过类调用,要么通过方法调用 一 ...

  7. [Java] - 格式字符串替换方法

    Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...

  8. atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug

    atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug 1. core.setProperty(o, "materialId&qu ...

  9. JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

随机推荐

  1. Docker持久化存储与数据共享

    一.Docker持久化数据的方案 基于本地文件系统的Volume:可以在执行docker create或docker run时,通过-v参数将主机的目录作为容器的数据卷.这部分功能便是基于本地文件系统 ...

  2. 浅谈jQuery构造函数

    $()函数到底做的什么 jQuery在前端领域路人皆知,对于一向喜欢玩js的博主来说,虽然能力有限,但是还是很喜欢研究他的做为.那么一个简单的美元符号$与一对常见的()括号,jQuery底层到底做了哪 ...

  3. Daily Scrum9 11.13

    昨天的任务已完成. 今日任务: 姓名 今日任务 时长 徐钧鸿 测试SQL包里的代码 2h 张艺 继续搭建还没搭建完的框架 修复bug 2h 黄可嵩 继续进行搜索响应编写 2h 徐方宇 搭建框架 修改b ...

  4. cnblogs用户体验及建议

    一.是否提供了良好的体验给用户(同时提供价值)? 我觉得博客园还是给用户提供了良好的用户体验的,它可以从用户的角度考虑,用户在注册的时候,用户自己在设置用户名和密码的时候,如果与他人重复会有提示,而且 ...

  5. quartusII13.0使用教程

    1.新建工程项目,填写项目存储路径和工程名,不要出现中文路径 2.添加已存在文件(可选),在[File name]下选择已经存在的工程项目,利用[Add]或[Add all]命令添加文件到新工程,点击 ...

  6. iOS- 本地文本容错搜索引擎2-->如何实现英文(英文首字母,汉语拼音)对中文的搜索?

      1.前言 先闲说几句,最近北京的雾霾真是大,呛的我这攻城师都抗不住了.各位攻城师们一定要爱护好自己的身体!空气好时,少坐多动. 如果条件好的话,最好让你们BOSS搞个室内空气净化器.因为那几天一般 ...

  7. C++操作mysql方法总结(2)

    C++通过ODBC和通过MFC ODBC操作mysql的两种方式 使用vs2013和64位的msql 5.6.16进行操作 项目中使用的数据库名和表数据请参考C++操作mysql方法总结(1)中的介绍 ...

  8. Prism6下的MEF:添加Logger

    上篇已经简单的构建了一个Prism的程序,现在我们需要添加一个Logger,Prism本身自带一个功能简单的TextLogger,但是我们希望能用.Net常用的Log4net.所以我们需要重载掉Boo ...

  9. 前端切图相关ps技术

    标签(空格分隔): 前端切图 复制图层到一个新的ps文件 对于单个图层 1.选中图层 2.CTRL+A全选 3.CTRL+C 4.CTRL+N新建文件,文件大小默认就可以(背景透明也在这个面板设置), ...

  10. 在Delphi中获得唯一32位长字符串

    function GetGUID: string; var   vGUID: TGUID;   vTemp:string; begin   if S_OK = CreateGuid(vGUID) th ...