Class.getResource与Class.getClassLoader.getResource归纳整理
2015-08-18 00:15
453 查看
这两个getResource()是使用当前ClassLoader加载资源(即资源在 Class path中),这样资源和class直接打在jar包中,避免文件路径问题.
两者不同是Class的getResource()方法是从当前.class 文件路径查找资源, ClassLoader则是从jar包根目录查找
Class.getResource()
public java.net.URL getResource(String name)查找带有给定名称的资源. 查找与给定类相关的资源的规则是通过定义类的 class loader 实现的.此方法委托给此对象的类加载器.如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String).
在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:
ClassLoader.getResource()
public URL getResource(String name)查找具有给定名称的资源.资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等). 资源名称是以 ‘/’ 分隔的标识资源的路径名称.
此方法首先搜索资源的父类加载器;如果父类加载器为
null,则搜索的路径就是虚拟机的内置类加载器的路径.如果搜索失败,则此方法将调用 findResource(String) 来查找资源.
两个方法的区别是资源的定义不同,
一个主要用于相对与一个object取资源,而另一个用于取相对于classpath的资源,用的是绝对路径.
在使用Class.getResourceAsStream 时,资源路径有两种方式,一种以/开头,则这样的路径是指定绝对路径,
如果不以/开头,则路径是相对与这个class所在的包的.
在使用ClassLoader.getResourceAsStream时, 路径直接使用相对于classpath的绝对路径.
project
|-src
|-com.xx.test
|-Main.java
|-b.bmp
|-resource
|-com.icon
|-a.bmp
Main.class.getResource("/icon/a.bmp"); // NOT icon/a.bmp
Main.class.getResource("b.bmp");
// need to add resource/a.bmp to build path! it will be package in jar file
Main.class.getClassLoader().getResource("icon/a.bmp");
// NOT /icon/a.bmp or a.bmp
Thread.currentThread().getContextClassLoader().getResource("icon/a.bmp");
资源文件为一般后缀文件:
files———bin——core(生成class包)
| | |——Main.class(生成的class文件)
| |
| |——resource( 生成资源文件夹)
| |——a.bat
| |——b.png
|———src——core(源包)
| |—— Main.java(源代码)
|
|——resource(源资源文件夹)
|——a.bat
|——b.png
jar之后可能出现找不到的问题
String
path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
File af=new File(path+"/resource");
String[]
files =af.list();
资源文件为图片文件:
你将所有资源打包为epm.jar,你的类位于一个包中:package core;你的图片资源全部放在images文件夹中,而images文件夹也位于core包内。这样的话,最终的路径表现为:
epm———bin——core(生成class包)
| | |——Main.class(生成的class文件)
| |
| |——images( 生成资源文件夹)
| |——system.bat
| |——background.png
|———src——core(源包)
| |—— Main.java(源代码)
|
|——images(源资源文件夹)
|——system.bat
|——background.png
可以通过相对路径来访问:
java.net.URL imUrl = getClass().getResource("images/background.png");
ImageIcon im = new ImageIcon(imUrl);
如果你的类有很多,并且包的结构很复杂,应该把图片放到最外层,让所有的类通过绝对路径来访问该图片
java.net.URL
imUrl = getClass().getResource("/images/background.png");
ImageIcon im = new ImageIcon(imgUrl);
两者不同是Class的getResource()方法是从当前.class 文件路径查找资源, ClassLoader则是从jar包根目录查找
Class.getResource()
public java.net.URL getResource(String name)查找带有给定名称的资源. 查找与给定类相关的资源的规则是通过定义类的 class loader 实现的.此方法委托给此对象的类加载器.如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String).
在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:
ClassLoader.getResource()
public URL getResource(String name)查找具有给定名称的资源.资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等). 资源名称是以 ‘/’ 分隔的标识资源的路径名称.
此方法首先搜索资源的父类加载器;如果父类加载器为
null,则搜索的路径就是虚拟机的内置类加载器的路径.如果搜索失败,则此方法将调用 findResource(String) 来查找资源.
两个方法的区别是资源的定义不同,
一个主要用于相对与一个object取资源,而另一个用于取相对于classpath的资源,用的是绝对路径.
在使用Class.getResourceAsStream 时,资源路径有两种方式,一种以/开头,则这样的路径是指定绝对路径,
如果不以/开头,则路径是相对与这个class所在的包的.
在使用ClassLoader.getResourceAsStream时, 路径直接使用相对于classpath的绝对路径.
project
|-src
|-com.xx.test
|-Main.java
|-b.bmp
|-resource
|-com.icon
|-a.bmp
Main.class.getResource("/icon/a.bmp"); // NOT icon/a.bmp
Main.class.getResource("b.bmp");
// need to add resource/a.bmp to build path! it will be package in jar file
Main.class.getClassLoader().getResource("icon/a.bmp");
// NOT /icon/a.bmp or a.bmp
Thread.currentThread().getContextClassLoader().getResource("icon/a.bmp");
java.net.URL fileURL = this.getClass().getResource("/UI/image/background.jpg");
InputStream in = this.getClass().getResourceAsStream("/UI/image/background.txt");
资源文件为一般后缀文件:
files———bin——core(生成class包)
| | |——Main.class(生成的class文件)
| |
| |——resource( 生成资源文件夹)
| |——a.bat
| |——b.png
|———src——core(源包)
| |—— Main.java(源代码)
|
|——resource(源资源文件夹)
|——a.bat
|——b.png
jar之后可能出现找不到的问题
String
path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
File af=new File(path+"/resource");
String[]
files =af.list();
资源文件为图片文件:
你将所有资源打包为epm.jar,你的类位于一个包中:package core;你的图片资源全部放在images文件夹中,而images文件夹也位于core包内。这样的话,最终的路径表现为:
epm———bin——core(生成class包)
| | |——Main.class(生成的class文件)
| |
| |——images( 生成资源文件夹)
| |——system.bat
| |——background.png
|———src——core(源包)
| |—— Main.java(源代码)
|
|——images(源资源文件夹)
|——system.bat
|——background.png
可以通过相对路径来访问:
java.net.URL imUrl = getClass().getResource("images/background.png");
ImageIcon im = new ImageIcon(imUrl);
如果你的类有很多,并且包的结构很复杂,应该把图片放到最外层,让所有的类通过绝对路径来访问该图片
java.net.URL
imUrl = getClass().getResource("/images/background.png");
ImageIcon im = new ImageIcon(imgUrl);
URL logFileURL = UltraCollectUtil.class.getClassLoader().getResource(fileName);
只是当后面的fileName是一个相对路径的时候,就会在当前这个ULTraCollectUtil这个类的当前位置开始查找资源文件,
如果是个绝对路径的话,那前面的类是任意的Java类都可以了,因为.class.getClassLoader()是为了获得一个类加载器,
用来加载classpath下的.class文件而已。
getResource返回的是一个URL对象,不要简单的认为是这个资源的绝对地址,
一般是通过这个URL对象来构造Java中的FIle对象以及Icon对象等等, File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile()); String icon = "../image/1.gif "; button.setIcon(new ImageIcon(getClass() .getResource(icon)));
相关文章推荐
- wpf 对一个集合操作的时候,怎么保留单张的信息
- Oracle Coherence中文教程六:Coherence集群简介
- java语言实现jsp页面验证码
- linux下互斥锁的使用
- java8 新特性
- Android开发中那些相见恨晚的方法、类、接口、工具
- nginx+tomcat+memcached实现session共享
- android tabhost Intent实现
- SqlServer 根据字段分类汇总信息
- Android之通过HttpURLConnection.getResponseCode状态码抛出异常的问题以及解决方法
- HDOJ-2066-一个人的旅行(最短路)
- 小技巧:Windows Server 2012&R2 WiFi 无法连接问题
- Codeforces Gym 100431G Persistent Queue 可持久化队列
- [LeetCode] Word Search
- Oracle Coherence中文教程五:Coherence调试
- Largest Number
- Android事件分发机制学习笔记
- Java学习-026-类名或方法名应用之二 -- 统计分析基础
- 二进制的编码
- Oracle Coherence中文教程四:构建一个Coherence 应用