Java项目获取路径方法

article/2025/8/14 9:24:17

Java项目中根据相对路径和绝对路径获取文件的方法(重要)

首先,项目中文件分布情况如下,innerFile.txt位于test.test包下,innerInnerFile.txt位于test.test.inner包下,outterFile.txt位于包的根目录下,

文件位置

那么,在App类里,如何根据相对路径、绝对路径获取innerFile.txt、innerInnerFile.txt和outterFile.txt呢?

class.getResource(name)

先来看一下Class.getResource(name)方法,该方法接收一个表示文件路径的参数,返回一个URL对象,该URL对象表示的name指向的那个资源(文件)。这个方法是在类中根据name获取资源。其中,name可以是文件的相对路径(相对于该class类来说),也可以是绝对路径(绝对路径的话,根目录符号/是代表项目路径而不是磁盘的根目录)。例如,如下两种根据路径获取文件的效果是一样的 :

  1. App.class.getResource('innerFile.txt')
  2. App.class.getResource('/test/test/innerFile.txt')

由于innerFile.txt和App类是在同一个包下,所以通过App.class和相对路径可以获取到App这个类的包下面的innerFile.txt文件。而当传入的是绝对路径/test/test/innerFile.txt,getResource()方法是从项目的包的根目录开始解析路径的。所以这两种获取文件的效果是一样的。

classLoader.getResource(name)

该方法的作用与class.getResource(name)的作用一样,接收一个表示路径的参数,返回一个URL对象,该URL对象表示name对应的资源(文件)。但是,与class.getResource(name)不同的是,该方法只能接收一个相对路径,不能接收绝对路径如/xxx/xxx。并且,接收的相对路径是相对于项目的包的根目录来说的。比如,如下两种获取文件的效果是一样的:

  1. App.class.getResource('innerFile.txt')
  2. App.class.getClassLoader().getResource('test/test/innerFile.txt')

classLoader.getResource('test/test/innerFile.txt')是相对于项目的包的根目录来解析路径的,所以通过该路径能够获取到innerFile.txt,并且不能传入绝对路径,否则报错。
介绍完了这两种,那么应该能够根据这两种方法分别获取到innerInnerFile.txt文件和outterFile.txt文件吧?

class.getResource(name)与classLoader.getResource(name)的联系

如上所述,class.getResource(name)能够接受相对路径和绝对路径,而classLoader.getResource(name)只能接收相对路径,那么这两种方法的联系是什么呢?

通过查看class.getResource(name)源码,可以看到,class.getResource(name)最终其实是通过classLoader.getResource(name)来获取资源文件的,如,

// class.getResource(name)方法
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);
}

其中,class.getResource(name)首先会对name进行解析和处理,如,

// class.getResource(path)中对path预处理path = resolveName(path)
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();  // 获取带包路径的类名,此处类名是App,包的路径是test.test,所以baseName就是test.test.App。int index = baseName.lastIndexOf('.');if (index != -1) {name = baseName.substring(0, index).replace('.', '/')  // 给参数加上当前类所在的包的路径前缀,即在name之前加上test/test,之后会委托给classLoader来getResource(path),而classLoader默认是从项目根路径获取资源的。+"/"+name;}} else {// path以'/'开头,则去掉开头的'/',采用classLoader.getResource(去掉开头'/'后的path)来获取资源。name = name.substring(1);}return name;
}

其中,如果传入的是绝对路径,那么去掉最前面的/,然后会委托给classLoader.getResource(name)处理;如果传入的是相对路径,那么首先获取到当前class类的完整包名,把包名中的.替换成/,也就是说,App类获取到包名是test.test.App,那么会被替换成test/test/App,然后委托给classLoader.getResource(name)处理。

总结

class.getResource(name)中name可以写成绝对路径/test/test/innerFile.txt和相对路径【假设该class位于test.test包下】”innerFile.txt”,其中绝对路径的/是相当于项目的classpath根目录,相对路径是相对于当前class的路径。classLoader.getResource(name)中的name一定要写成相对路径如test/test/innerFile.txt(最前面不能是/,并且这个相对路径是相对于项目的classpath根目录的路径,相当于class.getResource(name)中写绝对路径/test/test/innerFile.txt

这2个方法都是返回URL对象,接着可以通过getPath()方法获取String类型的路径:

this.getClass.getClassLoader().getResource('test/test/innerFile.txt').getPath()

可以通过这个方式直接获取输入流:

InputStream is = TemplateExcelUtils.class.getClassLoader().getResourceAsStream("template/"+sourcePath);

注意:class.getResource()和classLoader.getResource()获取的路径可以从项目根路径开始的,项目根路径指的是如图:(我们打包后的项目中,层级是下图所示的层级)

路径获取常用方法:

Javaweb的不常用方法:

以工程名为/DemoWeb为例:
访问的jsp为:http://localhost:8080/DemoWeb/test/index.jsp

1 JSP中获得当前应用的相对路径和绝对路径
(1)得到工程名:request.getContextPath()
结果:/DemoWeb

(2)得到包含工程名的当前页面全路径:request.getRequestURI()
结果:/DemoWeb/test/testpath.jsp

(3)得到IE地址栏地址:request.getRequestURL()
结果:http://localhost:8080/DemoWeb/test/testpath.jsp

(4)得到当前页面所在目录下全名称:request.getServletPath()
结果:/test/testpath.jsp

(5)得到页面所在服务器的全路径(实际的路径):application.getRealPath(“testpath.jsp”)
结果:D:\Develop Files\apache-tomcat-5.5.15\apache-tomcat-5.5.15\webapps\DemoWeb\testpath.jsp
D:\Develop Files\apache-tomcat-5.5.15\apache-tomcat-5.5.15为tomcat的安装路径

2.java 的Class中获得相对路径,绝对路径的方法

(1)类的绝对路径:
System.out.println(TestPath.class.getResource("/").getPath());
结果:/E:/workspace/workspace_tcc/DemoWeb/WebRoot/WEB-INF/classes/

System.out.println(TestPath.class.getResource(""));
结果:file:/E:/workspace/workspace_tcc/DemoWeb/WebRoot/WEB-INF/classes/demo1/

(2)得到工程的路径:System.getProperty(“user.dir”)
结果:E:\workspace\workspace_tcc\DemoWeb

(3)获取WEB-INF路径:request.getServletContext().getRealPath("/")           有误

结果:E:/workspace/workspace_tcc/DemoWeb/WebRoot/WEB-INF/

个人实践获取javaweb路径
this.getServletContext()和req.getServletContext()都是通过ServletContext()来获取路径
String realPath1 = this.getServletContext().getRealPath("/");
String realPath2 = this.getServletContext().getRealPath("/WEB-INF/upload");
String realPath3 = req.getServletContext().getRealPath("/");System.out.println(realPath1);
System.out.println(realPath2);
System.out.println(realPath3);结果:(项目名称:smbms)
E:\javaWEB\apache-tomcat-9.0.40\webapps\smbms\
E:\javaWEB\apache-tomcat-9.0.40\webapps\smbms\WEB-INF\upload
E:\javaWEB\apache-tomcat-9.0.40\webapps\smbms\


http://chatgpt.dhexx.cn/article/22E8VkC4.shtml

相关文章

Java-银行项目

该项目用了三个类Customer,CustomerList,CustomerView。 Customer为实体对象&#xff0c;用来封装用户信息。相当于model。 CustomerList为Customer对象的管理模块&#xff0c;内部用数组管理Customer对象&#xff0c;并提供相应的添加&#xff0c;修改&#xff0c;删除和遍历…

MATLAB箱线图

MATLAB笔记之 作图 箱线图 1、峰值偏度检验 2、相关性作图 MATLAB分析数据相关性实例 3、箱线图看离散程度 如何使用matlab软件进行峰度-偏度检验https://jingyan.baidu.com/article/380abd0ab6f1c75d90192cee.html Matlab图解峰度kurtosis与偏度skewness 原1 Matlab图解峰度…

MATLAB运算符

1. MATLAB运算符 1.1 算术运算符 算术运算符运算法则算术运算符运算法则ABA与B相加(A、B为数值或矩阵)A-BA与B相减(A、B为数值或矩阵)A*BA与B相乘(A、B为数值或矩阵)A.*BA与B相应元素相乘(A、B为相同维度的矩阵)A/BA与B相除(A、B为数值或矩阵)A./BA与B相应元素相除(A、B为相同…

matlab subs函数

在matlab命令行查看subs函数的帮助 subs函数一共有三种使用方法&#xff1a; subs(s,old,new) subs(s,new) subs(s) 点击 subs 的参考页可以看到下面的详细说明: 第一种使用方法 说明&#xff1a;subs函数返回 函数s 的一个拷贝&#xff0c;s函数中的所有old变量都会替换为…

Matlab fprintf

fopen 文件访问类型 仅供学习记录 clc clear %% 01换行输出结果 fprintf([...\n...Matlab可以实现输出换行显示 \n...把你想要输出的内容换行写在[]中 \n...用换行符实现换行 \n...效果就是这样的 \n...]) %% …

数学建模与MATLAB计算之006.MATLAB中的条件语句

006.MATLAB中的条件语句 文章目录 006.MATLAB中的条件语句一、单分支if条件语句二、双分支if条件语句三、多分支if条件语句四、switch语句五、try语句 选择结构是根据给定的条件成立或不成立&#xff0c;分别执行不同的语句。 MATLAB 用于实现选择结构的语句有** if语句、swit…

matlab源码说明

目录 1.MATLAB概述 2.MATLAB程序使用几个常规注意实现 2.1.运行过程可能出现Out of Memory的问题解决办法 2.2.保存大于2G的数据 2.3.程序运行方法 1.MATLAB概述 Matlab经过不断的发展和完善,如今已成为覆盖多个学科,是具有超强数值计算能力和仿真分析能力的软件。…

Matlab逻辑运算符/与/或/非/异或/all/any

Logical()是非0则1&#xff0c;如果数字是非零&#xff0c;输出为1&#xff0c;数字为零&#xff0c;输出为0 与或非 与&#xff1a;&&#xff0c;有0则0&#xff0c;全1则1 或&#xff1a;|&#xff0c;有1则1&#xff0c;全0则0 非&#xff1a;~&#xff0c;0变1&#…

转行学计算机测试,转行软件测试后悔了

原标题&#xff1a;转行软件测试后悔了 很多时候&#xff0c;都在想当初做的转行软件测试行业的决定是对的吗&#xff1f;现在后悔还来得及吗&#xff1f; 其实我刚参加织雀教育的培训班一个月&#xff0c;各方面都学起来感觉有难度&#xff0c;毕竟是零基础转行的&#xff0c;…

【小结】南京大学软件工程专硕2021二战小结

今年的考研也告一段落了&#xff0c;从导师那里听到了一些风声&#xff0c;应该是可以上岸了&#xff0c;上班划水&#xff0c;没啥事&#xff0c;总结一下两年的混子生活吧。拟录取出来就公开。&#xff08;三百多分也舔着个脸写经验贴&#xff09; 逻辑很差、文笔稀碎、错别…

嵌入式软件工程师_程序人生一名嵌入式软件工程师的成长总结

哈喽,我是老吴。今天分享一篇18年毕业生的总结文。文章于首发于[嵌入式大杂烩] (2019-10-16)。文章里干货多多,各位慢慢品读吧。 一、我的工作经历 1.1 第一家公司 1.2 第二家公司 1.3 第三家公司二、小、中、大公司的特点 2.1 小公司 2.2 中等公司 2.3 大…

2023年双非二战跨考上岸南京大学软件工程842专硕考研初试403分经验贴

&#x1f4a1; 考研过程的中心思想&#xff1a;脚踏实地、少走弯路、不要乱搞 目录 1.前期准备 2.个人情况 3.择校方面 4.备考里程表 5.数学 6.英语 7.政治 8.专业课 9.复试 10.后记 & 致谢 由于有不少朋友都私信我&#xff0c;想要做的笔记&#xff0c;所以我建…

气象学和计算机专业,没毕业就被签走的铁饭碗专业 气象学

有一个专业的就业率很好&#xff0c;到那时人们却不这样认为&#xff0c;是哪个专业呢&#xff1f; 气象学 每每一说到这个专业的就业好&#xff0c;都有很多人来反对。他怎么能好呢&#xff1f;我也没看见身边有人做气象这个行业的啊、 其实气象学的就业率是非常的高的&#x…

软件工程课程的第一次作业

软件工程课程第一次作业 1、建立一个public代码仓库1.1获取秘钥1.2 创建代码仓库1.2.1仓库地址 2、评估当前的自己2.1个人简介2.2当前值 3、展望未来3.1 回答关于构建之法的问题 4、学习路线 这个作业属于哪个课程广工软件工程课程学习社区作业要求作业链接作业目标创建博客、学…

从物理到软件工程,中山大学转专业2017纪实

我的转专业历程 其实早就有想写几篇文章纪念在中大的这一年,也确实写过一篇,但是还是太懒没能坚持下去,在知乎上获得的成就感也不是很高。正好借这个机会写出来当作能够在未来唤起一点点回忆的东西吧。 还是把原来最后面的联系方式摆在上面比较好 qq:715817451 还依稀记得…

软件工程专业困局

点击上方“开源社”关注我们 | 作者&#xff1a;tisonkun | 转载自&#xff1a;野田之书 | 编辑&#xff1a;刘雪洁 | 设计&#xff1a;朱亿钦 | 责编&#xff1a;王玥敏 让我们先看两段材料。 第一段出自《软件困局》[1]一书中文版译序。 软件专业的学生并没有学到在团队中如何…

软件工程专业学生的自我反思

迷茫时的反思 我现在是一名大三的学生&#xff0c;有时候还是会处在一种很迷茫的状态&#xff0c;这种状态体现在&#xff1a;自己会不自觉的打开王者荣耀&#xff0c;打开BiliBili刷视频&#xff0c;熬夜看剧&#xff0c;慢慢地陷入一个漩涡&#xff0c;越陷越深...... 你是否…

女孩学计算机软件工程,女生学软件工程好吗 就业方向有哪些

软件工程是一个很热门的专业&#xff0c;男生学该专业的人数比较多&#xff0c;但是不少女生听说软件工程好就业也心动了&#xff0c;那么女生报考软件工程好不好呢&#xff0c;毕业后能做什么工作呢&#xff1f; 女生适合学软件工程专业吗 软件工程专业之所以适合男生去学&…

软件工程专业大学四年学什么

软件工程专业&#xff08;软件开发与数据处理技术方向&#xff09;大学四年学什么&#xff1f; 未完待续&#xff0c;打※部分已更新“期末复习资料、课堂作业、实验报告或课设报告”请读者自行查阅我的博文分组&#xff01; 每届都是“实验性选教材、排课”&#xff0c;you …

IT是未来大趋势,有学计算机专业的同学会后悔和转行原因在哪?

本文为伊凡原创撰写投稿一颗优雅草仅仅代表伊凡个人观点&#xff0c;与一颗优雅草科技无关切不代表其立场&#xff0c;谢谢&#xff0c;欢迎喜欢写文的道友来投稿&#xff0c;未经许可禁止转载。 计算机科学与技术/信息工程专业/物联网/计算机软件工程/软件开发与技术/计算机网…