Java关于相对路径和绝对路径

绝对路径

绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件。

/开头的就是绝对路径(win&Linux),Windows中也可以直接以为盘符去声明绝对路径

例如我写了/src/main/... 第一个反斜杠在windows中就代表你所在的盘符的标识,比如D://src/main/...

相对路径

当前工作目录是指当前文件所在的目录

相对路径就是依赖于当前工作目录的。

所谓相对路径,就是相对于自己的目标文件位置。
./ 代表的是当前目录,也可以省略直接写文件名或者目录名。
../ 代表的是上一级目录,也就是父级目录。
../../ 代表源文件所在目录的上上级目录,依次类推

Java中使用

java 复制代码
    public static void main(String[] args) throws Exception{
    	// 这个属性表示的是当前 Java 应用程序的启动目录(也称为工作目录或用户目录),并且这个路径是相对于文件系统的根目录的完整路径
        System.out.println("System.getProperty(\"user.dir\") = " + System.getProperty("user.dir"));

		// 直接写目录,前面不带任何斜杠
        File file1 = new File("src/main/resources/config/config.ini");
        System.out.println("file1 = " + file1.getAbsolutePath());
        // 使用 ./ 开始写目录
        File file2 = new File("./src/main/resources/config/config.ini");
        System.out.println("file2 = " + file2.getAbsolutePath());
        // 使用 / 开始目录
        File file3 = new File("/src/main/resources/config/config.ini");
        System.out.println("file3 = " + file3.getAbsolutePath());
    }

打印结果

xml 复制代码
System.getProperty("user.dir") = D:\Data\IdeaWorkSpace\aliyun_oss_study
file1 = D:\Data\IdeaWorkSpace\aliyun_oss_study\src\main\resources\config\config.ini
file2 = D:\Data\IdeaWorkSpace\aliyun_oss_study\.\src\main\resources\config\config.ini
file3 = D:\src\main\resources\config\config.ini

总结

1.可以看到Java中强烈不建议使用./开头,IDE运行的结果不太对,但是./确实是当前目录。
2.如果你想以相对路径的形式访问文件,不需要添加斜杠即可(就像file1),那么当前路径其实是System.getProperty("user.dir")输出的路径
3.从file3可以看到,以斜杠/开头完全就是以当前根目录开头的,在win系统下就是以你所在的盘符开头的,在输出结果中看到我的是D盘

最后建议在项目中以上形式都不要使用,如果要访问文件最好以类路径的方式去访问项目资源,这样可以最大程度保证源代码和服务器上跑的服务都可以访问到文件

java 复制代码
		// 最推荐  类加载的形式读取数据  不用在意源代码和编译后的文件的位置
        InputStream resourceAsStream = CommonUtil
        	.class
        	.getClassLoader()
        	.getResourceAsStream("config/config.ini");

一般源代码和编译后的jar包中的资源位置都不一样的,这样获取类路径的方式可以保证不出错,下图可以看到实际都是从类路径中拿到的

相关推荐
风象南4 分钟前
SpringBoot 控制器的动态注册与卸载
java·spring boot·后端
醇醛酸醚酮酯22 分钟前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
jioulongzi27 分钟前
记录一次莫名奇妙的跨域502(badgateway)错误
开发语言·python
我是一只代码狗30 分钟前
springboot中使用线程池
java·spring boot·后端
hello早上好43 分钟前
JDK 代理原理
java·spring boot·spring
PanZonghui1 小时前
Centos项目部署之Java安装与配置
java·linux
向阳@向远方1 小时前
第二章 简单程序设计
开发语言·c++·算法
沉着的码农1 小时前
【设计模式】基于责任链模式的参数校验
java·spring boot·分布式
Mr_Xuhhh2 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
纳兰青华2 小时前
bean注入的过程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘
java·开发语言·spring·list