在开发java程序的过程中,我们经常要做的一件事就是获取资源。那么什么是资源呢?说白了,在计算机里那就是一堆数据。只是这堆数据对我们的java程序有多种表现形式,一般来说有File,URL,InputStream等等。而单就文件这一项就有很多种:配置文件,java类文件,jps文件,图片、css、js文件等等。面对这林林总总的资源,我们在设计一个读取资源的接口时,就需要针对不同形式的资源提供方法,这样就导致我们的接口还是与实际的资源形式绑定在一起,未能完全的抽象。另外,在java程序中资源的存放位置也是各异的。有的存放在classpath中,有的存放在文件系统中,有的存放在web应用中。而对于不同位置的资源,java程序获取这些资源的方法各有不同。
A、获取classpath中的资源:
Java代码
URL url = this.getClass().getResource("resource_name");
URL url = this.getClass().getClassLoader().getResource("resource_name");
URL url = Thread.currentThread().getContextClassLoader().getResource("resource_name");
甜性涩爱下载
http://www.bt285.cn/content.php?id=1196863
那么在jdk中为什么又提供了三种方式来获取classpath下的资源呢?这其中是有些来头的。
第一行代码中是利用Class类的实例来获取,第二行代码是使用加载当前类的classloader来获取。看下jdk中的源代码会发现class类的实例最后还是委托加载他的classloader来获取资源的。
Java代码
/**
* 色即是空2下载
http://www.bt285.cn/sejishikong/
爱的色放下载
http://www.bt285.cn/aidesefang/
*/
public java.net.URL getResource(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResource(name);
}
return cl.getResource(name);
}
从上面的代码中可以看出,对于资源的加载并没有像类加载所采用的双亲委托机制。而是当前类的classloader不为null的情况下先从当前类的classloader中加载资源。而只有当前类的classloader为null的时候才从system classloader中去加载资源。这样可以方便我们自定义配置类覆盖一些默认配置。当然,j2se应用中如果没有特别定制classloader时,我们自己写的类都是被system classloader加载的。到底利用class去获取资源和利用classloader去获取资源有什么区别呢?区别就在 resolveName(name)这个方法中。两种方式对于资源名称的表示方式不同。下面是一个简单的包结构,/表示类路径的根
/
|-com.cn.test
|-Test.class
|-test2.txt
|-test1.txt
Java代码
// 获取与当前类在同一个包下的资源
URL url1 = this.getClass().getResource("test2.txt");
// 获取com.cn.test包下的资源,需加/
URL url2 = this.getClass().getResource("/com/cn/test/test2.txt");
// 获取类路径根下的资源
URL url3 = this.getClass().getClassLoader().getResource("test1.txt");
// 获取包com.cn.test包下的资源
URL url4 = this.getClass().getResource("com/cn/test/test2.txt");
而第三利用当前线程的contextClassLoader来获取资源的解释可以参考我的另一篇
B、获取文件系统中的资源
Java代码
// 1、获得File对象
File file = new File("test.txt");
// 2、获得File对象的字节流
InputStream in = new FileInputStream(file);
值得注意的是在File的构造函数File(String name) 中的name参数可以是相对路径和绝对路径。相对路径是相对于System.getProperties("user.dir")的。
C、获取web应用中的资源
Java代码
servletContext.getResourceAsStream(resource_name);
resource_names为相对于webroot的路径表示。例如获取web.xml,resource_name表示为"/WEB-INF/web.xml"
面对上面介绍的各种资源表现形式和存放位置,难道java中就没有提供一个统一处理方式吗?有,java.net.URL。
从名称上来看 URL(Uniform Resource Locator) 统一资源定位器。看起来很好很强大。但很多时候使用它并不能定位到我们需要的资源。
首先,它jdk中体统的URL能访问的协议非常有限(当然可以进行扩展,不过很麻烦);常用的有http,file,ftp等等。并没有提供对classpath和servletContext中的资源的获取方法。
另外,它没有提供判断资源是否存在的方法。每次只有等我们真正去获取资源的时候抛出异常才能知道资源无法获取。
其次,URL这个类的职责未划分清楚,既用来表示资源有用来获取其资源。
分享到:
相关推荐
以下是从给定文件中整理出的Java资源网站大全,这些网站不仅提供了丰富的学习资料,还涵盖了最新的技术动态、实践案例以及开发者社区,对Java学习者来说极为宝贵。 ### 1. Sun Developer Network (SDN) Home 网址...
通过这个"Java编辑的语法分析器",开发者可以获得即时的语法反馈,提高编码效率,减少调试时间。对于学习编译器原理和实践的人来说,这样的工具也是极好的学习资源。同时,这个工具也可以作为IDE(集成开发环境)的...
JavaCore分析工具是一种在Java应用程序出现问题时,如CPU占用过高或出现Out Of Memory (OOT)错误时,用于诊断和分析的利器。它主要用于Java虚拟机(JVM)的故障排查,尤其是在使用像Websphere或Weblogic这样的企业级...
总的来说,这个压缩包提供的资源对于理解和实践Java代码的调用链分析非常有帮助,无论是初学者还是经验丰富的开发者,都能从中受益。通过深入学习和应用JavaParser,我们可以更好地理解和优化Java代码,提升软件的...
在Java编程环境中,进行音频文件的频谱分析是一项复杂但重要的任务,特别是在音频处理和音乐信息检索领域。本文将深入探讨如何使用给定的压缩包文件来实现这一目标。 首先,频谱分析是将时域信号转换为频域表示的...
在这个“java案例分析”中,我们可以深入理解Java的核心概念和实际应用。这些案例旨在帮助学习者掌握Java编程的关键技巧,提升编程能力。 1. **基础语法与数据类型**:Java的基础包括变量声明、数据类型(如整型、...
在IT行业中,尤其是在Java应用程序的开发和调试过程中,理解并分析线程堆栈是非常关键的。线程堆栈反映了程序运行时的线程状态,帮助开发者定位和解决多线程问题,如死锁、资源竞争等。IBM为WebSphere Application ...
Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...
- 时间序列分析:通过分析日志数据的时间分布,可以发现系统的繁忙时段,有助于资源调度和容量规划。 - IP地理位置:结合第三方库,如MaxMind的GeoIP数据库,可以获取客户端IP的地理位置信息,帮助理解用户分布。 ...
7. **深入分析**:除了基本的资源使用情况,Java NMON还可以帮助你识别进程消耗资源的状况,找出可能的性能瓶颈。例如,你可以查看哪个进程的CPU占用率最高,或者哪个磁盘的I/O等待时间最长。 通过以上步骤,Java ...
在实际操作中,首先我们需要获取Java应用的堆转储文件(通常通过JVM的`jmap`命令或者Java Flight Recorder生成)。然后,使用MAT打开这个文件,进行分析。MAT会解析堆转储,并显示内存概述,包括总内存使用、对象...
在Java编程语言中,处理汉字并获取其相关信息,如拼音、部首、笔画和笔画数目,是一项挑战性但非常实用的任务。这通常涉及到自然语言处理(NLP)和字符编码的理解。以下是对这个主题的详细阐述: 首先,我们要明白...
"Java资源参考列表"是一个针对Java程序员精心编纂的工具书目清单,由行业权威人士详细整理,旨在为开发者提供全面的学习路径和实用的参考资料。这份列表涵盖了从基础概念到高级技术的各种主题,帮助Java程序员在学习...
“Java20套项目资源”这一标题明确指出这是一份包含20个项目的Java资源包。这表明该资源可能涵盖了一系列不同的应用场景和技术栈,旨在帮助学习者或开发者快速了解并掌握Java的实际应用。 #### 描述理解 描述部分...
- **知识点**: 此网站提供了一个较为全面的Java资源库,覆盖了从入门到进阶的各种教程和文档。 - **特点**: 内容涵盖了Java SE、Java EE等不同方向,还包括了大量的实战案例分析。 - **适用人群**: 适用于各个层次的...
6. 绩效管理:根据设定的考核标准,评估员工的工作表现,JAVA可以通过算法和数据分析工具,实现公正、客观的绩效评价。 此外,系统设计还需要考虑用户体验,使用Spring Boot、Hibernate等框架可以简化开发,提高...
本资源包含一个基于Java开发的A股量化分析平台的完整源代码、数据库文件以及接口文档,旨在帮助个人投资者提升投资决策的科学性和收益性。以下将详细解释该平台的关键知识点。 1. **Java编程语言**: Java是这个项目...
### Java资源同步详解 在Java开发中,资源同步是一个非常重要且常见的问题,尤其是在多线程环境中,合理地管理资源能够有效提升程序的稳定性和效率。根据提供的标题与描述,本次将深入探讨“Java资源同步”的相关...
### Java线上故障分析:线程dump与堆内存分析 #### 引言 在现代软件开发中,Java作为一门广泛使用的编程语言,在企业级应用、Web服务、大数据处理等多个领域发挥着重要作用。然而,随着系统复杂度的提升,线上环境...
**Mac OS上的Java内存分析工具MAT** 在Java应用程序开发中,内存管理是至关重要的,特别是对于大型、长期运行的应用程序,内存泄漏可能导致性能下降甚至系统崩溃。为了有效地诊断和解决这些问题,开发人员需要借助...