Java项目中获取路径的绝对路径问题和相对路径问题
前言:
在纯 Java 代码里 我们一般都会用class.getResource(String name) 或
者 class.getClassLoader().getResource(String name)
两种方法获取文件的地址 (当然不止这两种方法)。今天就说说这两种方法的异同。这里说的纯 Java 代码不是 Java web 项目。
1.目录结构
2.class.getResource(String name)
输入:可以接受相对路径(相对于该 class 类)或者绝对路径(根目录符号为 / 代表项目的根目录 不代表硬盘的根目录)
返回:URL 对象 该对象表示指向 name 的资源
// 获取相对路径 此时获取的是该class文件的同级目录 System.out.println("相对路径:同级目录下的配置文件>"+Main.class.getResource("demo.properties")); // 获取的绝对路径 相对于跟目录来说的 System.out.println("绝对路径:同级目录下的配置文件>"+Main.class.getResource("/com/xing/demo/demo.properties")); System.out.println("相对路径:上一级目录下的配置文件>"+Main.class.getResource("../xing.properties")); System.out.println("绝对路径:根目录下的配置文件>"+Main.class.getResource("/src.properties")); // 当传入的是绝对路径(带有‘/')的时候,getresource()方法会从项目的根目录开始解析路径地址
输出:
相对路径:同级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/demo/demo.properties
绝对路径:同级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/demo/demo.properties
相对路径:上一级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/xing.properties
绝对路径:根目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties
3.class.getClassLoader().getResource(String name)
输入:只能接受相对路径 但此相对路径是相对于根目录来说的
返回:URL 对象
// src 在根目录下 这里的同级也就是根目录了 System.out.println("相对路径:同级目录下的配置文件>"+Main.class.getClassLoader().getResource("src.properties")); System.out.println("相对路径:相对根目录的下一级目录下的配置文件>"+Main.class.getClassLoader().getResource("com/com.properties")); System.out.println("相对路径:相对根目录的下下一级目录下的配置文件>"+Main.class.getClassLoader().getResource("com/xing/xing.properties"));
输出:
相对路径:同级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties
相对路径:相对根目录的下一级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/com.properties
相对路径:相对根目录的下下一级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/xing.properties
注意:
/** * 下面两种有相同的作用 */ System.out.println("==相对路径:同级目录下的配置文件>"+Main.class.getResource("demo.properties")); System.out.println("==相对路径:相对根目录的下下一级目录下的配置文件>"+Main.class.getClassLoader().getResource("com/xing/demo/demo.properties"));
输出:
==相对路径:同级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/demo/demo.properties
==相对路径:相对根目录的下下一级目录下的配置文件>file:/E:/ideawork/pathdemo/out/production/pathdemo/com/xing/demo/demo.properties
3.1区别
两者的区别:
其实我们看源码就知道class.getResource
其实就是用的 class.getClassLoader().getResource(String name)
。
只不过是class.getResource
会通过 resolveName
这个方法把传入的路径都转换为符合 class.getClassLoader().getResource()
的路径 然后让 getClassLoader
处理。
3.2ClassLoader
class.getClassLoader().getResource(String name)
使用的是 ClassLoader
,而 ClassLoader
的获取是有很多方法的。
获取 classLoader 的方法:
- Thread.currentThread().getContextClassLoader()
- ClassLoader.getSystemClassLoader().
- class.getClassLoader()
System.out.println(Thread.currentThread().getContextClassLoader().getResource("src.properties")); System.out.println(ClassLoader.getSystemClassLoader().getResource("src.properties"));
输出:
file:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties
file:/E:/ideawork/pathdemo/out/production/pathdemo/src.properties
扩展一下: 获取项目的硬盘目录 直到项目名级别的目录
// 输出:E:\sparkwork\pathdemo System.out.println(System.getProperty("user.dir"));
3.3关于 URL 的一些知识
URL fileURL = Main.class.getResource("/src.properties"); // 输出:file:/E:/sparkwork/pathdemo/out/production/pathdemo/src.properties System.out.println(fileURL.toURI()); // 输出:/E:/sparkwork/pathdemo/out/production/pathdemo/src.properties System.out.println(fileURL.getPath()); // 这两种方法都是可以的 File file = new File(fileURL.toURI()); Filw file2 = new File(fileURL.getPath())
到此这篇关于Java项目中获取路径的绝对路径问题和相对路径问题的文章就介绍到这了,更多相关Java项目中获取文件地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
JavaScript 与 Java 区别介绍 学java怎么样
JavaScript 是一种嵌入式脚本文件,直接插入网页,有浏览器一边解释一边执行。而java 语言不一样,他必须在JAVA虚拟机上运行。而且事先需要进行编译。接下来脚本之家小编给大家揭晓js与java区别,感兴趣的朋友一起看看吧2016-09-09SpringSecurity导致SpringBoot跨域失效的问题解决
本文主要介绍了SpringSecurity导致SpringBoot跨域失效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-01-01Mockito mock Kotlin Object类方法报错解决方法
这篇文章主要介绍了Mockito mock Kotlin Object类方法报错解决方法,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-09-09
最新评论