如何使用示例从Java中的类路径加载资源

Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容。 Java提供了API来将这些资源读取为InputStream或URL。 假设您在项目的config文件夹中有一个属性文件 ,并且想要加载该属性文件,该怎么做? 同样,您的项目的icons目录中有Web应用程序的图标和缩略图,如何加载它们? 答案是通过使用java.lang.Class'getResource()和getResourceAsStream()方法。 这些方法接受资源的路径为String并分别返回URL和InputStream。 您可以通过调用getClass()方法或使用类literal获取类的引用。 如果有一个对象,则可以调用getClass(),因为它是一个非静态方法,另一方面,如果没有任何对象,则可以简单地将.class与任何类的名称一起使用,例如Sample.class将为您提供java.lang.Class的参考。 JDK 1.1提供了这些方法,您甚至可以在有权访问核心Java库的任何地方使用它们。 如果要创建J2ME游戏或应用程序,则可以使用这些方法为游戏加载图标和图块,并为应用程序加载所有其他资源。

在内部,此方法将资源的加载请求委托给其类加载器。 如果对由BootStrap ClassLoader加载的对象调用getResourceAsStream()方法,则它将把它委托给ClassLoader.getSystemResourceAsStream(java.lang.String)方法。 我们将资源的路径传递给此方法,但是用于搜索与给定类关联的资源的规则是由该类的定义类加载器实现的。 由于您可以将绝对路径和相对路径都传递给Class.getResourceAsStream(),但是ClassLoader.getResourceAsStream()采用绝对路径,因此这就是使用以下算法从给定资源名称构造绝对资源名称的原因:

如果名称以'/'('\ u002f')开头,则资源的绝对名称是名称中'/'之后的部分。 否则,绝对名称的格式如下:
modified_pa​​ckage_name / name,其中modified_pa​​ckage_name是此对象的软件包名称,用“ /”代替“。”。 ('\ u002e')。

这意味着,如果app.properties存储在com.abc.config包中而不是当前类的包中,则传递给该方法的资源名称应类似于/com/abc/config/app.properties。

如果您通过使用快捷键Ctrl + T并键入java.lang.Class来查看Eclipse IDE中java.lang.Class的代码,则可以看到此方法的工作方式:

public InputStream getResourceAsStream(String name) {name = resolveName(name);ClassLoader cl = getClassLoader0();if (cl==null) {// A system class.return ClassLoader.getSystemResourceAsStream(name);}return cl.getResourceAsStream(name);
}

该算法是通过resolveName()方法实现的,如下所示:

/*** Add a package name prefix if the name is not absolute Remove leading "/"* if name is absolute*/private String resolveName(String name) {if (name == null) {return name;}if (!name.startsWith("/")) {Class c = this;while (c.isArray()) {c = c.getComponentType();}String baseName = c.getName();int index = baseName.lastIndexOf('.');if (index != -1) {name = baseName.substring(0, index).replace('.', '/')+"/"+name;}} else {name = name.substring(1);}return name;}

从Java中的类路径加载资源
使用getResourceAsStream()方法加载资源时出现的主要问题是NullPointerException ,因为此方法如果找不到资源,则返回null。 在下面的示例中,我们有一个Eclipse项目,并且我在config目录中创建了一个名为app.properties的属性文件。 现在要加载该文件,我只需要传递“ app.properties”,如果传递诸如“ config / app.properties”或“ /config/app.properties”之类的内容,getResourceAsStream()将返回null,随后代码将抛出NullPointerException如下所示:

Exception in thread "main" java.lang.NullPointerExceptionat java.util.Properties$LineReader.readLine(Unknown Source)at java.util.Properties.load0(Unknown Source)at java.util.Properties.load(Unknown Source)at Test.main(Test.java:29)

为了避免此错误,您必须在使用getResourceAsStream()之前检查其输出,由于这种方法,防御性编程就在那里。

这是我们完整的Java程序,可以从Java的classpath加载图像,资源,文本文件或二进制文件,资源可以是任何东西,重要的是必须可访问。

package test;import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;/*** Java Program to demonstrate how to load resources e.g. properties file from* classpath. There are two ways to load resources in Java, one by using* getResourceAsStream() and getResource() method from java.lang.Class. Main* difference between these two methods are that one returns an InputStream* while other returns a URL object.** @author Javin Paul*/
public class ResourceLoader{public static void main(String args[]) {// loading resource using getResource() methodInputStream in = Test.class.getResourceAsStream("app.properties");Properties config = new Properties();try {config.load(in);System.out.println(config.getProperty("name"));System.out.println(config.getProperty("version"));} catch (IOException e1) {e1.printStackTrace();}// loading resource using getResourceAsStream() methodURL resourceURL = Test.class.getResource("app.properties");Properties appConfig = new Properties();try {appConfig.load(resourceURL.openStream());System.out.println(appConfig.getProperty("name"));System.out.println(appConfig.getProperty("version"));} catch (IOException e) {e.printStackTrace();}}}Output:
SampleApp
1.0.0
SampleApp
1.0.0

如果仔细观察,您会发现我们同时使用了getResource()和getResourceAsStream()方法从Java中的类路径加载资源,在这种情况下只是属性文件。 第一个示例看上去比第二个示例更加简洁,因为我们不需要打开显式流,getResourceAsStream()方法将返回一个InputStream ,可以在任何地方使用它。 这就是如何从Java中的类路径加载资源的全部内容。

翻译自: https://www.javacodegeeks.com/2014/08/how-to-load-resources-from-classpath-in-java-with-example.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ext 3.0 +ASP.NET2.0 可视化开发介绍

Ext Designer 总算出来了!!!基于Web的应用开发终于可以可视化开发了,而且可以几乎不敲1行代码。 准备工具: (1)Ext Designer 1.0.2 (2)Visual Studio 2005 第一步&#x…

收集五款常用的HTML编辑软件

HTML(HyperText Mark-up Language)即超文本标记语言或超文本链接标示语言,是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声…

创建vue项目(一)搭建vue-cli、项目文件介绍、简单配置

记录一下 拉取项目时 npm run dev 报错 输入:npm rebuild node-sass 再重新 npm run dev 如果不能解决,请看这里 一、搭建vue-cli vue create 项目名称? Please pick a preset: > default (babel, eslint) //默认 > Manually select features …

JPA / Hibernate实体状态转换的初学者指南

介绍 Hibernate将开发人员的思维方式从SQL语句转移到实体状态转换。 一旦实体由Hibernate主动管理,所有更改将自动传播到数据库。 操作域模型实体(及其关联)比编写和维护SQL语句容易得多。 如果没有ORM工具,则添加新列需要修改所…

C# 接收邮件

C#没有内置收邮件的类,参考网络上的代码,针对POP3协议服务器使用 Jmail组件来收邮件,针对IMAP协议服务器使用LumiSoft.Net 。 另外,一般免费邮箱需要在邮箱设置中开启 POP3(或IMAP)、 SMTP服务才可以使用非…

js来监控复制粘贴

平时我们在复制网页上面代码到控制台调试时,有时会出现复制过来的代码后面加上了一下描述信息(作者、版权等信息),每次需要删除才能运行,所以今天看看怎么能保证我们粘贴的代码不携带这些信息呢? (function…

创建vue项目(二)引入elementUi、axios、准备静态资源、封装组件(.vue,js代码等)

下载安装node -> vue-cli -> 配置路由 -> 引入elementUi -> 公共组件 一、引入elementUi 顺便一提axios使用说明 和axios在vue中使用 二、准备静态资源 三、封装.vue公共组件 四、封装.js公共组件 五、封装公共的js代码 六、封装全局的filter、directive等 一、引入…

Spring DI的配置使用

1、 依赖和依赖注入 传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系: 泛化:表示类与类之间的继承关系、接口与接口之间的继承关系; 实现:表示类对接口的实现; 依赖&a…

休眠身份,序列和表(序列)生成器

介绍 在我以前的文章中,我谈到了不同的数据库标识符策略。 这篇文章将比较最常见的替代主要关键策略: 身份 序列 表(序列) 身份 IDENTITY类型(包括在SQL:2003标准中)受以下支持:…

flex pv3d 有用公式

实用公式 统领全书,我们已经有了各种运动和效果的公式。我已经提取出了最实用和最常用的公式、方程、以及代码的摘录,并将它们列在本章的最后。我认为将它们放到同一个地方应该对大家非常有帮助,因此我将这些我认为最需要的内容放到一起作为…

http https http2.0

一.http状态码 1xx(信息性状态码,接受的请求正在处理)2xx(成功状态码,请求正常处理完毕)200 OK204 No Content:请求成功但没有资源返回206 Partial Content:范围请求3xx&#xff08…

创建vue项目(三)路由跳转、反向代理、本地存储、状态管理

数据更新渲染&#xff0c;axios请求数据&#xff0c;配置环境 一、路由跳转 app.vue <template><div id"app"><keep-alive><router-view/></keep-alive></div> </template><script> export default {name: app }…

jinfo:JVM运行时配置的命令行浏览

在最近的几篇博客中&#xff08;特别是在对Java EE 7性能调优和优化以及WildFly性能调优的书的评论中&#xff09;&#xff0c;我引用了自己过去在某些Oracle JDK命令行工具上的博客文章。 令我震惊的是&#xff0c;我从来没有专门解决过漂亮的jinfo工具&#xff0c;这篇文章旨…

javascript---parseInt(08)或parseInt(09)转换返回0的解决办法

javascript parseInt函数使用率非常高&#xff0c;主要功能是将一个string转换为integer。有两个重载&#xff1a; parseInt(s);parseInt(s,radix)第一个方式不再多说&#xff0c;第二个方式&#xff0c;radix是s所基于的进制。范围为2-36&#xff08;不在此范围函数将返回NaN&…

创建vue项目(四)路由相关知识、路由守卫、插槽、打包小细节

一、路由相关点 1. 路由跳转传参以及接参 https://segmentfault.com/a/1190000012393587 方法一&#xff1a; &#xff08;1&#xff09; 参数配置&#xff1a; { path : xx/:参数变量,component:xx}(2) 使用 <router-link toxx/参数></router-link>(3) 传参 …

Luogu5298 [PKUWC2018]Minimax

太久没写博客了&#xff0c;过来水一发。感觉自己推式子的功力还不够。。。 题目链接&#xff1a;洛谷 首先我们想到&#xff0c;考虑每个叶节点的权值为根节点权值的概率。首先要将叶节点权值离散化。 假设现在是$x$节点&#xff0c;令$f_i,g_i$分别表示左/右节点的权值$i$的概…

js实现类名的添加与移除

方法1&#xff1a;使用className属性&#xff1b; 方法2&#xff1a;使用classList API&#xff1b; //用于匹配类名存在与否 function reg(name){return new RegExp((^|\\s) name (\\s |$)); }//hasClass addClass removeClass toogleClass var hasClass,addClass,removeCla…

js封装常用函数

自己封装函数时&#xff0c;参数最好不要超过3个&#xff0c;若要超过&#xff0c;可以用数组或者对象&#xff1b; 1. 利用&#xff08;Math.random&#xff09;写指定范围的随机数 2. 补零 3. 数组去重 4. 排序 5. 敏感词过滤 6. 判断数组中是否存在某一条数据&#xff0c;结…

redis学习(一)

1.redis安装&#xff08;来自 https://www.runoob.com/redis/redis-install.html&#xff09; window下安装 下载地址&#xff1a;https://github.com/MSOpenTech/redis/releases。 Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择&#xff0c;这里我们下载 R…

多项式相加链表

#include <stdio.h> #include <stdlib.h> typedef struct Node //一个项节点 { int modulus; //系数 int cover; //幂 struct Node* next; }List; void creatList(List *&l) //创建多项式链表 { List* r; List* s; int n; l (List*)malloc(sizeof(Node)); r …