绝对路径、相对路径详解

article/2025/11/8 23:13:17

绝对路径、相对路径详解

  • 一、概括
  • 二、绝对路径、相对路径
    • 2.1 Linux文件路径分析
    • 2.2 Maven项目路径分析
      • 2.2.1、项目路径
  • 二、如何精确查找到资源文件
    • 2.1、本地资源文件
    • 2.2、网络资源文件
      • 2.2.1、先来解释 两个名词:URI 、URL
      • 2.2.2、URI 标准格式
      • 2.2.3、URI 与 URL 区别
    • 2.3、网络资源文件定位
    • 2.4、URL编码
  • 三、路径的标识法

一、概括

在实际Java项目中,我们的成员可能使用IDE不一致,主要分 eclipse,IDEA两类,当开发阶段,其项目运行的相对路径可能会存在一些差异。

  1. 当pro环境,jar包形式,其配置文件路径恒定,不存在差异,只有项目的配置路径是否正确判断,若不对运行报错;
  2. 当dev环境,因为IDEA 与 Eclipse 打开项目文件树形结构不一致,造成项目运行的相对路径有差异!
  • IDEA 项目路径图如下: (父子组成树形结构)
    在这里插入图片描述
  • Eclipse 项目路径图如下: (父子项目是平行结构)
    在这里插入图片描述

上述总结是工作时,发现头次用IDEA启动项目,log日志报错,原因就是application.yml 配置查找 logback.xml位置搞错所致,至此,有必要来说说绝对路径和相对路径。

二、绝对路径、相对路径

讨论路径,首先我们来看看Linux这个典型文件路径!

2.1 Linux文件路径分析

# 系统根目录
[hawin@localhost ~]$ cd /
[hawin@localhost /]$ # 当前用户目录 
[hawin@localhost /]$ cd ~
[hawin@localhost ~]$ ll
total 112664
drwxrwxr-x 2 jht jht      4096 Jun 11 14:55 lincese
drwxrwxr-x 8 jht jht      4096 Oct 16  2019 logs
drwxrwxr-x 2 jht jht      4096 Oct 12  2019 pic
drwxrwxr-x 4 jht jht      4096 Jun  2 14:34 projects# 1、从根目录 查看 当前用户下的 pic文件夹 
[hawin@localhost /]$ cd /home/hawin/pic 
# (/home/hawin/pic 就是一个绝对路径,外部访问可以根据此目录)# 2、从当前用户,查看当前用户下 pic/p001/p01.png
[hawin@localhost ~]$ cd pic/p001 
# (pic/p001 就是一个相对路径,外部无法直接访问此目录。注意不能“/”开头)# 3、额外说明:windows跟Linux类似,只不过没有 "/" 根目录的概念,
# 是以磁盘 C,D,E等为根目录,并且不区分 反斜杠\, 斜杆/ ;
D:\soft\eclipse>cd /
D:\>
# 若是eclipse下的pic/p001文件夹,其绝对路径: d:\soft\eclipse\pic\p001

所以,绝对路径是以系统根目录为依据;相对路径则可能多样变化,主要依赖相对主目录属性。
上述讨论的相对主目录即是当前用户目录:/home/hawin/;
【so,容易得出:绝对路径 = 相对主目录 + 相对路径】;
即 pic/p001/p01.png 的绝对路径 = /home/hawin/ + pic/p001/p01.png;

了解了Linux文件路径,接下来再看一个Maven工程项目!

2.2 Maven项目路径分析

例如:一个Maven工程目录如下图
在这里插入图片描述

2.2.1、项目路径

上图是以IDEA工具打开maven项目(eclipse类似注意前面讲的不一致即可),可以看出一个项目路径在顶部:E:\GitHub\JavaEE\study-code\log-sample-maven
这个项目有个能独立运行的 module:client-privileges。

那么当 client-privileges 在编码若访问 其对应 resource/aa.txt,该如何写文件路径? 参考下面代码

@Test
public void testFilePath()  {// 1. 使用绝对路径  d:/hawin/code/study-access/target/classes/a.txt// 2. 使用相对路径  target/classes/a.txt// 3. 使用 ClassLoader 直接定位:URL 即是绝对路径ClassLoader classLoader =ClassLoader.getSystemClassLoader();URL resource = classLoader.getResource("a.txt");
//        resource = null;
//        assert resource !=null;System.out.println("path = "+ resource.getPath()+",\n rel = "+ resource.getRef());try(FileInputStream fis = new FileInputStream(resource.getPath())){byte[] buf = new byte[1024];while ((fis.read(buf)) != -1){System.out.println(new String(buf));}}catch (IOException e){e.printStackTrace();}}

【结论】

  1. maven项目的绝对路径 = 项目路径(相对主目录) + 运行时target路径(相对路径);
  2. 上面3种路径定位资源,平时开发可能不会直接使用绝对路径,target路径。因为部署后绝对路径肯定不是当时开发是那个绝对路径;target相对路径也只是IDEA工具临时运行文件,部署后是jar,war包形式,也就没有这个target了。 所以,必定用到ClassLoader来动态定位资源;

==========================================================
【注意】导入工程到IDEA目录不一样,项目路径也有不一致,如前面讲的 IDEA, Eclipse 差异差不多。以 E:\GitHub\JavaEE\study-code 为例:

  1. 以E:\GitHub\JavaEE\study-code打开项目,其本身为项目路径);
  2. 以module:client-privileges 打开项目,则E:\GitHub\JavaEE\study-code\client-privileges是项目路径)
  3. 当打成jar包放入 E:\ 下面:运行jar包时,E:\ 就是项目路径
# jar 包运行下的 resource中 aa.txt
# 1.绝对路径 
absolutePath=file:/E:/zcode/client-privileges-1.0-SNAPSHOT.jar!/aa.txt
# 2. 相对路径: jar包名称即相对点
relativePath = client-privileges-1.0-SNAPSHOT.jar!/aa.txt

二、如何精确查找到资源文件

前面讲了绝对路径是会变的,一般不会根据绝对路径去定位资源文件。
所以那一定是用相对路径来定位资源文件,那相对路径如何确认呢?

2.1、本地资源文件

对于一个在本地运行的软件,定位资源文件,很容易知道相对路径。
若此时在代码写死相对路径,那就基本上玩完了,当环境改变肯定是找不到对应的资源。

那要怎么样在代码里面灵活设置,定位到资源文件呢?
有如下2种方式:(也可说是4种)

 URL resURL = TestDemo.class.getResource("/policy");String path1 = resURL.getPath();System.out.println("path1:"+path1);URI resUri = TestDemo.class.getResource("/policy").toURI();String path2 =  resUri.getPath();System.out.println("path2:"+path2);String path3 = Test.class.getClassLoader().getResource("policy").getPath();System.out.println("path3:"+path3);String path4 = Test.class.getClassLoader().getResource("policy").toURI().getPath();
System.out.println("path4:"+path4);===== console:  【注意】policy 文件夹要有信息,否则不会进入运行的target目录 ========
path1:/E:/GitHub/JavaEE/study-code/log-sample-maven/client-privileges/target/classes/policy
path2:/E:/GitHub/JavaEE/study-code/log-sample-maven/client-privileges/target/classes/policy
path3:/E:/GitHub/JavaEE/study-code/log-sample-maven/client-privileges/target/classes/policy
path4:/E:/GitHub/JavaEE/study-code/log-sample-maven/client-privileges/target/classes/policy

上面 getResource( path). 这个path是相对 项目的资源文件根目录的一个路径。 这个路径在编码时,是非常好确认的!

题外话:
1、资源文件是不是只能是main的resources这个文件呢?答案是否定的!因为getResource方法是指项目资源文件一个集合,在IDEA只要指定为Resources Root都能被getResource直接定位到!
2、平时开发时,resources目录被藏的太深,时常会在项目的最外层配置一个config文件目录设置为Resources Root!

2.2、网络资源文件

上面的4种方式获取资源文件,当打成jar运行时。会有如下结果:

=============console:=================
path1:file:/E:/zcode/client-privileges-1.0-SNAPSHOT-jar-with-dependencies.jar!/policy
path2:null
path3:file:/E:/zcode/client-privileges-1.0-SNAPSHOT-jar-with-dependencies.jar!/policy
path4:null

会发现toURI()方法后就变成null了! 这里就涉及 URL/URI 的区分!

2.2.1、先来解释 两个名词:URI 、URL

  • URI : 统一资源标志符(Uniform Resource Identifier)
    –> 对任何抽象或物理资源进行完整标识的字符序列;

  • URL : 统一资源定位符(uniform resource location)
    –> 除了标识资源可用的位置之外,URI的一个子集描述了访问该资源的主要机制;

2.2.2、URI 标准格式

scheme:[// [user:password @] host [:port]] [/] path [?查询] [#片段]1、Scheme(方案):该方案列出了具体语法和URI的任何相关协议。方案不区分大小写,后跟冒号。理想情况下,URI方
案应该在互联网号码分配机构(IANA)注册,但也可以使用非注册方案。2、权限组件:权限组件由多个部分组成:可选的身份验证部分,主机(由注册名称或IP地址组成) , 以及可选的端口号。
身份验证部分包含用户名和密码,用冒号分隔,后跟at(@)符号。在@之后是主机名,然后是冒号,然后是一个端口号。
请务必注意,IPv4地址必须采用点十进制表示法,并且IPv6地址必须括在括号中。3、查询(可选):查询包含一串非分层数据。虽然语法没有明确定义,但通常是由分隔符分隔的属性值对序列,例如&符
号或分号。查询通过问号与前一部分分开。4、片段(可选):片段包含片段标识符,该标识符为辅助资源提供方向。

2.2.3、URI 与 URL 区别

URL是统一资源定位器,用于标识资源;URI(统一资源标识符)提供了更简单和可扩展的标识资源的方法。URL是URI的子集,下面我们就来看看一下URL和URI的主要区别是什么。

1、作用的区别

URL(统一资源定位符)主要用于链接网页,网页组件或网页上的程序,借助访问方法(http,ftp,mailto等协议)来检索位置资源。

URI(统一资源标识符)用于定义项目的标识,此处单词标识符表示无论使用的方法是什么(URL或URN),都要将一个资源与其他资源区分开来。

2、可以说URL是URI(URL是URI的子集),但URI永远不能是URL。

3、协议区别: URL指定要使用的协议类型,而URI不涉及协议规范。

说白了,URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。但是、不是每个URI都是URL的(一般情况下是一致的!);

还有在java.net.URI你只能看到他的一些属性,他只是表示一个位置,但是你没有办法通过URI获取到这个对象的流,但是URL就不同了。java.net.URL该类提供方法(openConnection()),通过该方法我们可以通过IO流操作他。但是URI中我貌似没看到相关的方法。【URL是可以直接操作的,但是URI并不行】
(通常URL,我们看作成:浏览器的网址!)

# URI 非URL. 无法通过下面定位到资源。
# 其实际是这个是一本书的isbn,可以唯一标识这本书,更确切说这个是URN。
urn:isbn:0-486-27557-4# URI 非URL :只是标记邮件到某某邮箱,并不能找到什么资源
mailto:cay@horstman.com# URI 又是 URL, 能通过下面的定位标记,找到改资源!
https://www.zhihu.com/question/21950864

【扩展】
URI = Universal Resource Identifier 统一资源标志符
URL = Universal Resource Locator 统一资源定位符
URN = Universal Resource Name 统一资源名称

前面提到一个问题:
url.toURI.getPath() null ; —> 这个 decode(path) 返回一个null. 也就是说jar包运行,uri.getPath有风险。尽管会转码,但还是不建议使用。 至于 why? 没去深入查原因了,有谁知晓,发我哈,感激不尽!
url.getPath() 不是null; —> 直接返回了 path。

2.3、网络资源文件定位

认知URL、URI. 知晓都是用来定位资源文件的! 并且可以本地、网络资源文件都可以定位。
那么网络资源文件具体定位如何,参考如下:

//购物车服务层
app.service('cartService',function($http){//购物车列表this.findCartList=function(){return $http.get('cart/findCartList.do');}//添加商品到购物车this.addGoodsToCartList=function(itemId,num){return $http.get('cart/addGoodsToCartList.do?itemId='+itemId+'&num='+num);}
}
<a href="${pageContext.request.contextPath}/myServlet"> 去找我!
</a>
<form action="userServlet" method="post">姓名:\<input id="username" name="username" type="text">密码:\<input id="password" name="password" type="text"><input type="submit" name="提交">
</form>

经过分析,一般情况都是使用 URL的相对路径来定位的! 当然也可以使用全路径来定位,如jsp中 ${pageContext.request.contextPath}/myServlet; 而下面的form就是一个相对路径了!

至于URL 前面部分:scheme:[// [user:password @] host [:port]] ,整个工程部署时会灵活配置即可!

2.4、URL编码

当平时我们是使用一些级别比较低的浏览器,会发现 一些URL中有 (%E4%F6%B2…)这种形式的信息,其实就是中文。在数据传递,资源定位时,中文是不友好的。一般需要转码,这里就是转成URL编码格式。【现在高级别的浏览器已做优化显示处理,但是实际传递还是URL编码格式!】

public static void main(String[] args) throws IOException, URISyntaxException {String p = "深圳太阳红";String encode = URLEncoder.encode(p, "utf-8");System.out.println(encode);byte[] bytes = "深圳太阳红".getBytes();ArrayList<String> list = new ArrayList<>();for(byte b:bytes){list.add(Integer.toHexString(b));}System.out.println(Arrays.toString(bytes));System.out.println(list);}================================
// %E6%B7%B1 %E5%9C%B3 %E5%A4%AA %E9%98%B3 %E7%BA%A2
// [-26, -73, -79, -27, -100, -77, -27, -92, -86, -23, -104, -77, -25, -70, -94]
// [ffffffe6, ffffffb7, ffffffb1, ffffffe5, ffffff9c, ffffffb3, ffffffe5, ffffffa4, ffffffaa, ffffffe9, ffffff98, ffffffb3, ffffffe7, ffffffba, ffffffa2]

结论:1、URL编码实际是 “汉字的十六制编码取后2位,其余位用%号取代”
2、平时我们讲中文占用2个字节,但是到utf-8格式,中文占用3个字节!

三、路径的标识法

1、"." – 表示当前目录,相对路径。

D:\apache-tomcat\bin>  ./startup.bat  (x)
D:\apache-tomcat\bin>  startup.bat  (v)
⇒ windows dos下 当前路径已经明确。 ‘.’ 将无效,外部命令;
【'.'在windows下不能被当做首选命令字段,但是还是表示当前目录。 
如  D:\apache-tomcat\bin>  cd .    目录不变!】[root@localhost bin]# startup.sh (x)
[root@localhost bin]# ./startup.sh (v)
⇒  linux下,使用标准的 '.' 表示当前目录;

总结:
1、当linux在运行命令时,必须带上 ./ 才能找当前目录下的命令;而windows则反之;
2、./ 当前放在最前面,一般都省略。如下:等效!
<img src='img/me.png'></img>
<img src='./img/me.png'>

3.2、"…" ---- 代表上一层目录,相对路径。
简单!如

 1)  cd .. : 回退到上一级目录`2)  <img src = '../../my.png'> 返回带上上级目录查找 my.png

3.3、"…/…/" ---- 上一层目录的上一层目录,相对路径。
同上!

3.4、"/" – 根目录,绝对路径。

1)  Linux:  
[root@localhost bin]#  cd / ==> 直接退到根目录下;2) windows:
D:\apache-tomcat\bin> cd /  ==> 只是退到当前磁盘根路径  `D:\`3) spring: 
@Service('/user/login)' 这个第1斜杠,代表根目录吗?
# spring 前面的第1斜杆,有无都可以,会自动识别4)  html:
<img src = '/img/me.png' /> 这种写法是否合理?
# 不合理,若是当前目录下img: 不要/, 或使用 ./ ; 
# 若是其他,先确定项目路径,然后确认文件html 与 被调用的文件的相对路径;

3.5、“D:/New folder/” – 物理路径,绝对路径。
简单,略!


http://chatgpt.dhexx.cn/article/WppwYYLR.shtml

相关文章

相对路径和绝对路径及表示

一、介绍 相对路径&#xff0c;它以当前的文件作为一个起点去查找另外的一个文件的所在位置。绝对路径是从电脑盘符或者域名开始的一个完整的路径。绝对路径是可以描述一个文件其各层目录的完整结构。 符号及其符号所代表的意义如下&#xff1a; ./&#xff1a;表示当前的文件…

绝对路径、相对路径、根路径

今天探讨一下浏览器和服务器中的绝对路径、相对路径和根路径 浏览器中 对于浏览器而言&#xff0c;是无法知道服务器中&#xff0c;文件目录路径的。因为浏览器获取的文件资源&#xff0c;很可能跟服务器中文件资源目录不对应。而服务器是知道每个文件和资源在具体的哪个位置…

c/c++ 绝对路径与相对路径

电脑硬盘C盘Program Files下&#xff0c;建新项目“test”&#xff0c;"test"下建立子文件夹“file”和头文件"data.h"&#xff0c;"file"下建新建文件“data.cpp”, 电脑资源管理器显示目录 C:Program Files\test\file\data.cpp 1. 相对路径 …

【详解】绝对路径和相对路径

通俗易懂&#xff1a; ①绝对路径&#xff1a; 在计算机中找到文件的位置&#xff0c;计算机表示文件位置的方式是路径。描述计算机完整的文件位置的路径称为绝对路径&#xff0c;如C:/website/web/a.html&#xff0c;这样我们通过这个路径找到文件的位置。在网站中&#xff0c…

7、绝对路径和相对路径

我们在使用 HTML 中的 <a> 标签、<img> 标签、<link> 标签以及 <script> 标签时往往会涉及到路径。例如 <a> 标签&#xff0c;如果我们在写路径时&#xff0c;使用了错误的路径&#xff0c;就会导致跳转失败&#xff0c;为了避免这种情况&#x…

Java中的绝对路径和相对路径

绝对路径和相对路径&#xff1a; 绝对路径&#xff1a; 绝对路径名是完整的路径名&#xff0c;不需要任何其他信息就可以定位它所表示的文件。&#xff08;注意&#xff1a;文件路径不能出现中文字符&#xff0c;否则可能会报错&#xff09; 相对路径&#xff1a; 在IDEA环境中…

Linux中的绝对路径和相对路径

回到顶部 一、介绍 1&#xff0c;文件路径 什么是文件的路径&#xff1f; 答&#xff1a;这个文件存放的地方&#xff0c;可以联想为 文件的“家”。 在Linux中&#xff0c;存在着绝对路径和相对路径 绝对路径&#xff1a;路径的写法一定是由根目录 / 写起的&#xff0c;例…

最最基础的干货:Linux中的绝对路径和相对路径

路径是Linux中最基本的概念之一&#xff0c;这是每个Linux用户都必须知道的。 路径是Linux中最基本的概念之一&#xff0c;这是每个Linux用户都必须知道的。 路径是指文件和目录的引用方式。它给出了文件或目录在 Linux 目录结构中的位置&#xff0c;由名称和斜杠组成。 /ho…

文件名 绝对路径与相对路径

EGE专栏&#xff1a;EGE专栏 目录 1. 文件路径1.1 DOS路径的构成1.1.1 卷号或驱动器1.1.2 目录名称1.1.3 文件名 1.2 当前目录 (Current directory)程序中当前目录的获取 1.3 切换盘符&#xff08;驱动器跳转&#xff09;1.4 设置当前目录1.4.1 驱动器的当前目录如何查看各驱动…

【软考学习14】绝对路径和相对路径的区别和联系

本文讲解文件存储中绝对路径和相对路径的区别和联系。简单来讲&#xff0c;绝对路径是把文件所在的完整路径逐一标识出来&#xff0c;相对路径是对某个目录的参考路径&#xff0c;在实战项目的开发中&#xff0c;相对路径会使用的多一些&#xff0c;绝对地址可以用于开发调试环…

python绝对路径和相对路径

今天记录一下python绝对路径和相对路径的问题 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、绝对路径二、相对路径三、如何查看当前所在目录 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可…

python的绝对路径和相对路径

一、绝对路径 一个文件的真实位置&#xff0c;根据这个路径层级可以找到这个文件即绝对路径。在wins上可以通过shift 鼠标右键调出来该文件的绝对路径&#xff0c;shift建按住不要松。 二、相对路径 相对路径即相对于当前的工作文件夹&#xff0c;你的路径是什么。 【绝对路径…

关于绝对路径与相对路径(详细)

绝对路径与相对路径总结&#xff08;详细&#xff09; 绝对路径与相对路径1 绝对路径1.1绝对路径&#xff08;盘符&#xff09;1.2绝对路径&#xff08;网址&#xff09; 2 相对路径2.1 相对路径(平级)2.2 相对路径(上一级)2.3 相对路径(下一级) 绝对路径与相对路径 在页面布局…

【计算机基础】绝对路径和相对路径

目录 一.绝对路径 二.相对路径 例如 三.举例 一.绝对路径 绝对路径是指从根目录开始的完整路径&#xff0c;包括所有父目录的路径&#xff0c;直到目标文件或者目录 所在的位置。 全文件名全路径文件名绝对路经完整的路径 例如&#xff0c;在windows系统中&#xff0c;绝…

Navicat premium 12 破解版下载及安装过程

在网上找了很多Navicat的破解版及下载补丁&#xff0c;都失效了&#xff0c;发现自己保留了一份&#xff0c;分享给大家。 链接&#xff1a;https://pan.baidu.com/s/1wK0j9SCm3LQLQmArjzwIyw 提取码&#xff1a;2333 1、首先安装navicat120_premium_cs_x64.exe&#xff0c;安…

LinuxCentOS安装破解版Navicat

首先在官网下载好对应位数版本的Navicat https://www.navicat.com.cn/download/navicat-premium 然后上传到linux上解压好 双击进来后点开这个文件 把编码改为中文 进入Navicat文件夹里,把该文件夹下所有东西都删除掉,留一个空文件夹 https://download.csdn.net/download/kxj1…

Mac OS下破解Navicat Premium

1、下载Navicat Premium 英文64位 http://download.navicat.com/download/navicat120_premium_en.dmg 中文简体64位 http://download.navicat.com/download/navicat120_premium_cs.dmg 2、生成自己的RSA公钥私钥对 注意&#xff1a;密钥是2048位的&#xff0c;PKCS#8格式 生…

navicat 历史版本下载

这里以 navicat premium 举例 进入官网 http://www.navicat.com.cn/选择 navicat permium 16点击免费试用点击直接下载&#xff0c;进入下载页面右键点击下载处【下图所示】修改链接&#xff0c;即可直接下载指定版本 点击免费试用 点击直接下载 进入下载页面会自动下载一次&a…

deepin安装navicat12 premium (破解版)替换商店的11版

参考&#xff1a;http://www.pianshen.com/article/8781183806/ 一、首先下载破解版的navicat 链接&#xff1a;https://pan.baidu.com/s/1ulptSderoG0EbEQpO3Adww 提取码&#xff1a;8oc3 二、解压 下载压缩文件&#xff0c;双击压缩文件&#xff0c;拖出文件即可 三、运…

mac 破解安装 navicat

Navicat Premium For Mac 12.0.2x 破解教程 安装步骤 第一步&#xff1a;下载Navicat Premium For Mac 12.0.22版本&#xff0c;正常安装。 navicat 下载地址&#xff1a;Navicat Premium for Mac v12.0.22下载 第二步&#xff1a;Finder中&#xff0c;选择应用程序 -》选择…