Java中如何以类为相对路径或以库为相对路径定位资源

从ROS2到ROS1:Lightning-LM激光SLAM模块的移植实践与核心代码解析 本文详细解析了将高性能激光SLAM算法Lightning-LM从ROS2移植到ROS1的完整实践过程。针对ROS1与ROS2在节点初始化、话题通信、参数服务器及TF发布等核心API的差异,文章提供了loc_system和slam模块的核心代码改造示例,并给出了适配catkin的CMakeLists.txt与package.xml配置方案,帮助开发者在现有ROS1生态中高效集成先进的SLAM模块。 阅读详情
◆ 一般情况下 , 我们都使用相对路径来获取资源 , 这样的灵活性比较大 .
比如当前类为 com/bbebfe/Test.class
而图像资源比如 sample.gif 应该放置在 com/bbebfe/sample.gif
而如果这些图像资源放置在 icons 目录下 , 则应该是 com/bbebfe/icons/sample.gif
通过当前类文件的路径获取资源主要有如下几种方式 :
· 假设当前类为com.bbebfe.Test
· 包所在的文件夹为bin
String imageName = "icons/sample.gif"
1, 通过 Class.getResource() 定位类路径下的资源 (bin/com/bbebfe/icons/sample.gif)
Class clazz = this.getClass();
URL url = clazz.getResource(imageName);
 
2, 通过 ClassLoader.getResource() 定位包的根目录下的资源 (bin/icons/sample.gif)
Class clazz = this.getClass();
URLClassLoader loader = (URLClassLoader)clazz.getClassLoader();
URL url = loader.getResource(imageName);
3, 通过 ClassLoader.findResource() 提供自己定制的方式定位资源
URL url = loader.findResource(imageName);
 
◆ 那么这三种方法有那些区别 , 我们应该在何时使用哪种方法呢 ?
· Class.getResource() 方法
该方法实际通过该Class的Class Loader的getResource()方法来获得资源, 在调用ClassLoader的getResource()方法之前, Class.getResource()方法会对资源名称做一定的处理,构建一个该资源的绝对名称(absolute name, 大意是:
       + 如果资源名称以'/'('/u002f') 开始, 则资源的绝对名称是'/'以后的部分.
              如果imageName是"/icons/sample.gif", 则在这里会变成"icons/sample.gif"
       + 否则对于其他情况, 绝对名称将是如下形式(给资源名称的前面加上modified_package_name/):
              modified_package_name/resource_name (修正的包名称/资源名称)
其中 修正的包名称含义是将 当前对象所在的包名称中的'.'('/u002e')替换为'/'
如果ClassLoader.getResource()方法返回一个值为null的URL, 则Class.getResource()方法最终会将资源请求交给 ClassLoader.getSystemResource(java.lang.String).
· ClassLoader.getResource() 方法
该对资源进行查找, 资源的名称是以'/'分隔的路径, 这个方法首先查找自己的父亲ClassLoader, 由自己的父ClassLoader来查找资源(实际上, 如果父亲的父亲不是空, 则父亲仍会向上提交查找请求). 如果自己的父ClassLoader是null, 则查找Java虚拟机中内建的class loader, 并将资源请求提交给它们, 如果这些操作都失败了, 则ClassLoader会调用自己的findResource()方法来查找资源.
· ClassLoader.findResource() 方法
该方法在内部查找指定的资源, 如果你实现了自己的 Class Loader, 则应该重载这个方法以自己特定的方式来查找类文件和资源 .
 
◆ 通过以上的总结 , 我们可以看到三点 .
1, 无论是getResource(), 还是findResource(), 这些方法都只是资源的定位方法, 最终都只是返回一个URL, 只是对资源的定位而已, 我们随后应通过自己的方法来读取这些资源. 而在Class和ClassLoader中还定义的有getResourceAsStream方法, 该方法是getResource的增强版, 这里就不介绍了.
2, 如果需要以类为相对路径查找资源 , 则应该调用 Class.getResource() 方法, 不要直接调用ClassLoader.getResource()方法. 另外, 除非是你自己定义了ClassLoader并重载了findResource方法,否则也不要直接调用ClassLoader.findResource方法, 因为在Class.getResource()方法中 会对资源名称作一定的处理, 这在上面介绍了, 下面举个实例:
       假设我的当前类在Eclipse工程Database下, 类所在的包是com.bbebfe.test, 而icons目录放在bin/com/bbebfe/test/目录下, 我需要得到icons/sample.gif文件的URL, 则调用this.getClass().getResource()得到的URL是:
       file:/E:/MyLife/MyProjects/Eclipse3.2/ Database/bin/ com/bbebfe/test/ icons/disremove.gif
 
3, 有时候我们希望某个jar库的图像资源在同一个icons下统一管理, 而不是为每个包下面的Class建一个icons, 也就是说 需要以库为相对路径来查找资源 , 此时则应该调用 ClassLoader.getResource()方法, 举个例子:
· 某个工程有如下的包结构:
       com.bbebfe.ui
       com.bbebfe.test
       com.bbebfe.database
· 如果以类为相对路径, 则在每个包下都必须建立一个icons目录, 并放置相应的资源文件. 如下:
       com.bbebfe.ui/icons/...
       com.bbebfe.test/icons/...
       com.bbebfe.database/icons/...
· 而我们可能希望在 根目录下放置一个icons目录, 把所有资源放置在这里管理, 这样还可以防止资源的重复. 就是如下形式
       com.bbebfe.ui
       com.bbebfe.test
       com.bbebfe.database
       icons/sample.gif ...
       则此时 我们应该调用 ClassLoader.getResource 方法, 由于它没有对资源名称作处理, 也就是说 没有将修正的包名添加到资源名称前, 所以它会在类所在的包的根下去查找资源.(运行java程序的语法是java com.bbebfe.ui.Test, 所以 根目录是com目录的上级目录).
◆ 最后 , 在 Java 中对资源进行定位的方法有很多种 , 在 Eclipse 源代码中还有如下一段定位文件资源的代码 , 还没有时间研究 , 以后再谈 :
ProtectionDomain domain = Main.class.getProtectionDomain();
CodeSource source = null;
URL result = null;
if (domain != null)
source = domain.getCodeSource();// 获得 code source
if (source != null)
      result = source.getLocation();// 获得 URL
          
String path = decode(result.getFile());//
// normalize to not have leading / so we can check the form
File file = new File(path);
path = file.toString().replace('//', '/');
// create a file URL (via File) to normalize the form (e.g., put
// the leading / on if necessary)
path = new File(path).toURL().getFile();
 
淘系商品的成长密码:历史与趋势透视 本文分析了淘系商品的发展历程,从早期的市场探索到如今的行业领先地位,深入探讨了技术创新、供应链优化、用户需求洞察等关键因素在淘系商品成功中的作用。通过对平台不断完善商品生态、提升购物体验和服务的过程分析,文章总结了淘系商品在竞争激烈的市场中如何通过创新应对挑战并推动电商行业的进步。未来,随着消费趋势变化和新兴模式的兴起,淘系商品将在更大范围内发挥其市场影响力。 阅读详情

相关推荐

从12摄像头到纯视觉:小鹏AI鹰眼方案如何用LOFIC技术省掉激光雷达?

本文深入解析小鹏汽车AI鹰眼方案如何通过LOFIC技术实现纯视觉自动驾驶,替代传统激光雷达。LOFIC摄像头在动态范围、噪声控制和HDR优化方面表现卓越,结合800万像素双目广角摄像头,达到激光雷达级测距精度。该方案不仅降低成本,还提升系统可靠性和用户体验,展示了纯视觉路线的技术潜力与边界。

t8u9v0w1x的博客 932

MyBatis(四)Mybatis全局配置及映射关系

一、配置文件内容 mybatis.xml就是Mybatis的全局配置文件。 全局配置文件需要在头部使用约束文件。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> 配置文件的顶层结构如下: c

全栈攻城狮JSON的博客 2888

AI for Science:GNN预测分子性质全流程详解与工业实践

从分子表示到工业落地,一文掌握图神经网络在药物研发与材料设计中的核心实战近年来,的浪潮正深刻变革着传统科研范式。在药物研发与材料设计领域,作为核心环节,已从传统的实验试错转向基于图神经网络(GNN)的智能计算。本文将深入解析GNN预测分子性质的,涵盖数据准备、模型设计、训练优化到工业部署,并揭秘前沿技术与实战案例。

datacanvas2426的博客 1674

MyBatis的配置及API解释

MyBatis核心文件 1.MyBatis核心配置文件层级关系 注意在MyBatis核心配置的.xml文件中配置的顺序是按照上述的顺序配置 The content of element type “configuration” must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,d

weixin_47267628的博客 780

深入解析mSATA与mini-PCIE接口的硬件设计要点

本文深入解析mSATA与mini-PCIE接口的硬件设计要点,涵盖信号定义、电源设计、高速信号处理及PCB布局布线等关键内容。通过实战案例和调试技巧,帮助工程师规避常见设计陷阱,提升电路设计效率,特别适合工业控制和嵌入式系统开发场景。

weixin_28741413的博客 315

【ceph】OSD-基本存储单元

OSD 是 Ceph 的基本存储单元,负责对象的存储、检索和数据副本的管理。每个 OSD 进程通常对应于存储集群中的一个物理或虚拟存储设备(如硬盘或 SSD)。OSD 是 Ceph 的关键组成部分,负责对象的存储、管理和复制。通过多个 OSD 共同协作,Ceph 能够提供高可用性、可扩展性和容错能力,适用于各种存储需求。

qq_42853133的博客 1998

java resource name,Java中,关于资源Resource的定位问题

通过class的getResource方法,查找与给定类相关的资源。1、class中getResource在JDK中的定义Finds a resource with a given name. The rules for searching resources associated with a given class are implemented by the definingclass lo...

weixin_33513218的博客 496

同态加密与SEAL库实战:CKKS参数调优避坑指南

本文深入探讨了同态加密技术中CKKS方案的参数调优实践,重点解析了SEAL库中`poly_modulus_degree`、`coeff_modulus`和`scale`三大核心参数的配置技巧与避坑指南。通过实战案例展示了如何平衡计算深度、精度与性能,为开发者提供了一套完整的参数优化方法论,帮助避免常见的'scale out of bounds'等错误,显著提升同态加密应用的可靠性和效率。

weixin_29315569的博客 226

java.lang.Class.getResource()这哥个方法主要是做什么用

查找带有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托给此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String)。 在委托前,使用下面的算法从给定的资源名构造一个绝对资源名: 如果 name 以 '/' ('\u002f') 开始,则绝...

weixin_33743880的博客 244

使用Transformer实现自动调制识别(RML2018)

image_size = 1024 # resize重置输入大小patch_size = 16 # 从输入图片中将被提取的块大小# 分成 num_patches 个块num_patches = (image_size // patch_size) #(72/6)**2 横着裁剪),],return x})

QAQIknow的博客 1321

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

Mybatis全方位剖析【二】——如何使用Mybatis?

Mybatis全方位剖析【二】——如何使用Mybatis?

weixin_45538589的博客 660

基于粒子群算法优化的灰色预测模型GM实现数据预测(附带MATLAB代码)

灰色预测模型(Grey Model,简称GM)是一种常用的非线性时间序列预测方法,它在处理少量数据和缺乏规律性的序列预测问题上表现出良好的性能。c. 建立灰色微分方程:根据紧邻均值生成序列建立灰色微分方程,通常形式为:dx(n) + ax(n) = b,其中dx(n)是紧邻均值生成序列,x(n)是原始序列。为了提高GM模型的预测准确性,我们将使用粒子群算法来优化灰色微分方程的参数a和b。a. 利用灰色微分方程进行预测:根据已得到的灰色微分方程,进行后续时间点的数据预测。首先,定义了两个函数。

CoderExtra的博客 606

[转] Java中如何以类为相对路径或以库为相对路径定位资源

原文地址:http://blog.youkuaiyun.com/ruyanhai/archive/2007/11/07/1871663.aspx   ◆ 一般情况下,我们都使用相对路径来获取资源,这样的灵活性比较大. 比如当前类为com/bbebfe/Test.class 而图像资源比如sample.gif应该放置在com/bbebfe/sample.gif 而如果这些图像资源放置在icons目录...

hxrs2008的专栏 154

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

classloader.getresources() 介绍

转载自: https://www.cnblogs.com/bhlsheji/p/4095699.html ◆普通情况下,我们都使用相对路径来获取资源,这种灵活性比較大. 比方当前类为com/bbebfe/Test.class 而图像资源比方sample.gif应该放置在com/bbebfe/sample.gif 而假设这些图像资源放置在icons文件夹下,则应该是com/bbebfe/ic...

weixin_34392435的博客 527

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java路径问题最终解决方案—可定位所有资源的相对路径寻址

转载自:http://blog.youkuaiyun.com/shendl/article/details/1427475 Java路径问题最终解决方案                                                                                                            —可定位所有资源的相对路径寻址

gwpJava的专栏 1987

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java 统一路径资源定位获取(相对路径与绝对路径)

前言 Java的路径问题,非常难搞。最近的工作涉及到创建和读取文件的工作,这里我就给大家彻底得解决Java路径问题。 我编写了一个方法,比ClassLoader.getResource(String 相对路径)方法的能力更强。它可以接受“../”这样的参数,允许我们用相对路径来定位clas...

chuanyuan6187的博客 1806

java new url 相对路径_Java路径问题终于解决方式—可定位全部资源的相对路径寻址...

1、在Java项目中,应该通过绝对路径訪问文件。下面为訪问的经常用法:第一种方法:类名.class.getResource("/").getPath()+文件名称另外一种方法:Thread.currentThread().getContextClassLoader().getResource("").getPath()+文件名称【主要使用】如果文件夹结构例如以下如今src文件夹下的类文件须要訪问c...

weixin_33599503的博客 1361

java定位的目录不对_Java路径问题最终解决方案—可定位所有资源的相对路径寻址...

1、在Java项目中,应该通过绝对路径访问文件,以下为访问的常用方法:第一种方法:类名.class.getResource("/").getPath()+文件名第二种方法:Thread.currentThread().getContextClassLoader().getResource("").getPath()+文件名【主要使用】假设目录结构如下现在src目录下的类文件需要访问config目录...

weixin_42509396的博客 1188

Java资源的定位方式

本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。   I/O操作在Java中是必须掌握的技术,其中文件的定位问题就极容易引起思维上的混乱。如下例:File f1 = new File("/test.txt");File f2 = new File("test.txt");我们将“/”开头的路径称为绝对路径,将非“/”开头的路径称为相

丑小鸭技术专栏 2767

java 文件 定位_Java中通过相对路径来定位文件

通常我们定位文件都是通过绝对路径进行定位,比如“F:/Java/bin/test/test.java”,这样的缺点就是,一旦项目文件移动,这些路径就完全失效。所以,下面我们来介绍一种通过相对路径来定位文件的方法。我用的IDE是eclipse,项目路径下有src和bin文件夹分别存放,java的源代码和编译文件。如图,我的工程名是project,在F盘的study目录下,包名是com.www,源文件...

weixin_33917663的博客 993

定位所有资源的相对路径寻址

转载自:http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1427475 Java路径问题最终解决方案                                                                                                           —可定位所有资源的相对路径寻址

小樓東風的专栏 795

Java相对路径与类路径详解

相对的是工作目录# 相对的是class文件所在的根目录# 相对的是ClassPathDemo.class所在的目录# 相对的是class文件所在的根目录,并且一定不能加斜杠。

小楼夜听雨的博客 1万+
上一篇: java中与Date相关的总结
下一篇: 常用的System.getProperty()
java_user
博客等级 码龄21年 11粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值