java开发中,常见的resource文件有:.xml,.properties,.txt文件等,后台开发中经常用到读取资源文件,处理业务逻辑,然后返回结果。
获取资源文件的方法说明
getResource()返回:URL
getResourceAsStream () 返回的是inputstream,需要定义一个InputStream接收
//Class.getResource和Class.getResourceAsStream在使用时,路径选择上是一样的。
相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果.
今天先了解一下如何读取资源文件的URL。
以下图的逻辑结构为例:

有4种读取文件URL的方法:
1.通过本类的class类的getResource方法
path不以’/'开头时,默认是从此类所在的包下取资源;
path 以’/'开头时,则是从ClassPath根下获取;
// 同一个包下
URL url1 = ResourceTest.class.getResource("test1.xml");
System.out.println(url1.toString());
//输出 file:/F:/kr-wyy/Studying/out/production/Studying/readFile/test1.xml
//不同包下,用相对路径
URL url2 = ResourceTest.class.getResource("/collection/test2.xml");
System.out.println(url2.toString());
//输出:file:/F:/kr-wyy/Studying/out/production/Studying/collection/test2.xml
//根目录下
URL url3 = ResourceTest.class.getResource("/test3.xml");
System.out.println(url3.toString());
//输出:file:/F:/kr-wyy/Studying/out/production/Studying/test3.xml /* 即: file:/F:/kr-wyy/Studying/out/production/Studying/readFile/test1.xml
file:/F:/kr-wyy/Studying/out/production/Studying/collection/test2.xml
file:/F:/kr-wyy/Studying/out/production/Studying/test3.xml*/
 2、通过本类的ClassLoader的getResource方法
path不能以’/'开头,path是从ClassPath根下获取;
所以可以认为:类名.class.getResource("/") == 类名.class.getClassLoader().getResource("")
 URL u1 = ResourceTest.class.getClassLoader().getResource("readFile/test1.xml");//同一个包下,还是要包名/文件名
System.out.println(u1); URL u2 = ResourceTest.class.getClassLoader().getResource("collection/test2.xml");//不同包下,要包名/文件名
System.out.println(u2); URL u3 = ResourceTest.class.getClassLoader().getResource("test3.xml");//根目录下直接写文件名
System.out.println(u3);
3、通过ClassLoader的getSystemResource(),路径和2一致
 URL r1 = ClassLoader.getSystemResource("readFile/test1.xml");//同一个包下,还是要包名/
System.out.println(r1); URL r2 = ClassLoader.getSystemResource("collection/test2.xml");//不同包下,要包名/文件名
System.out.println(r2); URL r3 = ClassLoader.getSystemResource("test3.xml");//根目录下直接写文件名
System.out.println(r3);
4、通过Thread方式,路径和2一致(推荐此种),Thread.currentThread().getContextClassLoader()

为什么推荐此类?
Test.class.getClassLoader().getResource,因为你想要获取某个资源文件的时候,这个资源文件的位置是相对固定的。
WEB程序,里面的jar、resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar、资源文件的时候,首先应该是使用Thread.currentThread().getContextClassLoader()。
如果你使用Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致(因为Java天生的多线程)
                URL l1=Thread.currentThread().getContextClassLoader().getResource("readFile/test1.xml");
System.out.println(l1); URL l2=Thread.currentThread().getContextClassLoader().getResource("collection/test2.xml");
System.out.println(l2); URL l3=Thread.currentThread().getContextClassLoader().getResource("test3.xml");
String l4=l3.getPath();//加上getPath()则去掉前面的file:
System.out.println(l3); //file:/F:/kr-wyy/Studying/out/production/Studying/test3.xml
System.out.println(l4);///F:/kr-wyy/Studying/out/production/Studying/test3.xml

另外,其他获取资源文件路径的有下面几个:

//        获取项目路径
System.out.println(ResourceTest.class.getResource("").getPath());
// /F:/kr-wyy/Studying/out/production/Studying/readFile/ // 获取根路径
System.out.println(ResourceTest.class.getResource("/").getPath());
// /F:/kr-wyy/Studying/out/production/Studying/ //获取当前工程路径
System.out.println(System.getProperty("user.dir"));
// F:\kr-wyy\Studying // 获取所有的类路径 包括jar包的路径
System.out.println(System.getProperty("java.class.path"));

上面的可以通过创建File文件,通过路径来读取文件内容。

但是对于打包到jar文件中的资源文件,则不能通过上面的getResource方法获取了,但可以通过Class类的getResourceAsStream()方法来获取 

例如:resource打包成jar包,我们读取里面的res.txt可如下,

/返回读取指定资源的输入流
InputStream is=this.getClass().getResourceAsStream("/resource/res.txt");
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String s="";
while((s=br.readLine())!=null)
System.out.println(s);
}
参考:
http://www.cnblogs.com/0616--ataozhijia/p/4094952.html
http://blog.csdn.net/zhoutaohenan/article/details/8467271

java基础知识3--如何获取资源文件(Java中获取资源文件的url)的更多相关文章

  1. java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

    /** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件 ...

  2. [Java基础] 深入jar包:从jar包中读取资源文件

    转载: http://hxraid.iteye.com/blog/483115?page=3#comments 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的 ...

  3. Java基础知识二次学习-- 第一章 java基础

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

  4. 大话java基础知识一之为什么java的主函数入口必须是public static void

    为什么java的主函数入口必须是public static void main (String[] args); 很多写javaEE好几年的程序员经常会记得java的主函数就是这么写的,但实际上为什么 ...

  5. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  6. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  7. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  8. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  9. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  10. java基础知识-笔记整理

    1.查看已安装jdk文件路径 CMD输入java -verbose.   2.java学习提升路线 java学习视屏地址: http://www.icoolxue.com/album/show/38 ...

随机推荐

  1. 解决若要安装 Microsoft Office 2010,需要MSXML 版本 6.10.1129的问题

    单击 开始单击 运行键入 注册表编辑器然后单击 确定. 找到HKEY_CLASSES_ROOT\TypeLib\{F5078F18-C551-11D3-89B9-0000F81FE221}\6.0\0 ...

  2. elasticsearch报错expected <block end>, but found BlockMappingStart解决方法

    我用的是elasticsearch2.4.0,在修改完配置文件就出现类似格式 expected <block end>, but found BlockMappingStart...... ...

  3. 如何在Win7安装U盘中加入USB3.0驱动的支持

    U盘安装系统出现鼠标键盘不能使用,在intel六代处理器平台,安装过程中会出现安装原生镜像不能识别或者鼠标键盘不能使用等情况,可以参考以下方法进行. 风险提示:重装或升级系统会导致系统盘数据丢失,建议 ...

  4. 浏览器F12进行Web程序调试

    转自http://www.cnblogs.com/yougewe/p/5152700.html 引语:如今的整个Web开发行业甚至说整个软件开发行业,已经相当成熟,基本上已经很少找不到没有前人做过的东 ...

  5. Spring MVC控制层传递对象后在JSP页面中的取值方法

    List<Order> orders = new ArrayList<Order>(); for (int i = 0; i < 3; i++) { Order t = ...

  6. koa/redux middleware系统解析

    middleware 对于现有的一些框架比如koa,express,redux,都需要对数据流进行一些处理,比如koa,express的请求数据处理,包括json.stringify,logger,或 ...

  7. 我的Markdown的利器——Markdown Here、有道云笔记、iPic

    Markdown逐渐成为大家文章编辑的首选,这里推荐两个比较冷门的Markdown工具. 用什么当做Markdown的主力工具? 网上有很多人推荐的Markdown的工具包括专业的Markdown工具 ...

  8. C++中const关键字用法

    为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替 ...

  9. C++学习日记(二)————初始字符串类型

    使用频率高,但操作复杂的数据有哪些? 做下总结: int; double;float;char;bool这些类型用的比较频繁,但并不复杂.但对于字符串来说(char数组)用的频繁但操作又复杂,只能用一 ...

  10. 【C++小白成长撸】--(续)双偶数N阶魔阵

    原理: 把双偶数N阶魔阵均分为(N/4)^2个4阶魔阵(4*4) 每个魔阵的对角线都标为"-1",其余位置标为"0" 从第一个位置(a[0][0])从左到右,从 ...