getPath(),getAbsolutePath(),getCanonicalPath() 区别
feilongw 2025-04-26 03:07 12 浏览
1. 前言
Java 开发中我们经常要获取文件的路径,比如读取配置文件等等。今天我们就关于文件的路径和如何读取文件简单地探讨一下。
2. 文件的路径
文件的路径通常有 相对路径 与 绝对路径。
相对路径
以当前文件为基准进行一级级目录指向被引用的资源文件。在 Java 代码中以当前运行的代码所在的位置为参照位置,只要被引用的文件相对于引用的文件的位置不变就可以被读取到。一旦改变相对位置就无法被读取到。
绝对路径
文件在文件系统中真正存在的路径,是指从硬盘的根目录(Windows为盘符)开始,进行一级级目录指向文件(从根目录一层层读写)。绝对路径顾名思义就是绝对的地址,就像你只要告诉别人你家的门牌号,他就能找到你家。而不是相对位置你告诉他在老王家的隔壁一样。
路径速记符
我们经常看到一些文件目录路径使用一些符号来简写,这里有必要总结一下(以类 Unix系统为例):
标识符 说明
../
表示当前文件所在的目录的上一级目录
./
表示当前文件所在的目录
/
表示根目录
~
当前用户目录, mac 下为 /Users/username,而 win10下为c:usersusername
Windows 下基本将 / 改为 `` 即可。
3. Java中读取文件
我们先来声明一个测试路径:
foo
|_src
| |_Test.java
| |_app.yml
其中 Test.java 用来编写读取 app.yml 文件的逻辑。Java 中通过java.io.File 来进行文件操作。并且提供了以下三个方法来获取文件的路径。
getPath
该方法返回文件抽象路径名的字符串形式。实际上就是传递给 File 构造函数的路径名。
因此,如果 File 对象是使用相对路径创建的,则返回的值也将是相对路径。如果是绝对路径就返回绝对路径。
File file = new File("./app.yml");
# 输出 path = ./app.yml
System.out.println("path = " + file.getPath());
# 如果为绝对路径
File file = new File("/Users/dax/IdeaProjects/foo/src/app.yml");
# 输出 path = path = /Users/dax/IdeaProjects/foo/src/app.yml
System.out.println("path = " + file.getPath());
getAbsolutePath
该方法返回文件的绝对路径。请注意!这里是有大坑的。如果你的文件在 Java 工程内,路径是按照编译后的路径计算的。
File file = new File("./app.yml");
# absolutePath = /Users/dax/IdeaProjects/foo/./app.yml
System.out.println("absolutePath = " + absolutePath);
同时我们发现该方法只解析当前目录(上面代码所在的目录)的相对路径,如果初始化中的路径包含了 章节 中的 速记符 ,速记符 将不会被解析。
因为速记符的存在,一个文件在文件系统中的 绝对路径 可以有很多个。
getCanonicalPath
速记符 不被解析有时候是很痛苦的事,我们可能需要知道具体的路径。getCanonicalPath() 方法解决了这个问题。
File file = new File("./app.yml");
# canonicalPath = /Users/dax/IdeaProjects/foo/app.yml
System.out.println("canonicalPath = " + file.getCanonicalPath());
由于getCanonicalPath()读取的是文件系统,因此会降低性能。如果我们确定没有使用速记符,并且驱动器号大小写已标准化(如果使用Windows OS),我们应该首选使用getAbsoultePath(),除非你的项目中必须使用 getCanonicalPath()。
规范路径(不包含速记符)对于一个固定位置的文件来说是唯一的。
相关推荐
- Java 智能外呼机器人源码
-
1个电话1分钱,烦人的AI外呼成大模型最成功应用?来源|Tech星球文|王琳说到大模型最成功的应用,你首先想到的可能是对话式机器人Kimi、豆包、文心一言等等,这些月活数百万尚无法盈利,甚至无...
- bios怎么进入win7(bios怎么进入win7旗舰版)
-
华硕B460主板重装win7系统教程以及BIOS设置方法(支持USB)intel第十代酷睿的公布,华硕发布了全新升级系列产品电脑主板,是继Z490电脑主板开售后服务,华硕B460系列产品电脑主板宣布先...
- iToolab UnlockGo for mac(苹果设备解锁工具) v4.5.0激活版
-
iOS设备解锁工具:iToolabUnlockGomac中文版iToolabUnlockGoforMac是一款专业的iOS设备解锁工具,iToolabUnlockGomac版能够在iP...
- arm linux gcc 安装(arm linux gcc命令)
-
「嵌入式」Linux开发工具arm-linux-gcc安装及使用知识架构及层次—程序编译及调试嵌入式交叉编译器安装配置宿主机执行编译、链接嵌入式软件的计算机目标机运行嵌入式软件的硬件平台“本地”编...
- 28推精英会专访IT博主卢松松
-
卢松松:我是创业人前段时间接受了中国青年政治学院的校内媒体《青春报》的一次访谈,那这次访谈主要是针对当代大学生对我目前所做的工作一次了解,也让大学生们对自媒体、站长、草根互联网有一个基本认识。这是一个...
- Android 中怎么使用IActivitymanager
-
Android操作系统之Activity的启动过程前言上篇文章写到Service的启动过程;相对来说Activity的启动过程比Service的启动过程更为复杂,其一Activity的生命...
- codesign 指令集 指令集编程
-
丛京生:可定制计算的设计自动化(感谢ASP-DAC组委会和北京大学罗国杰教授提供照片)我很有幸从第一届亚太地区设计自动化会议(ASP-DAC)起就参与到ASP-DAC这个大家庭。我的第一篇ASP-DA...
- CorelDRAW2023永久免费版图形图像处理软件
-
Mac上的CorelDRAW平面设计软件(cdr2023中文掌握创意的魔杖:畅游Mac上的CorelDRAW中文版亲爱的设计师们,一场设计之旅即将展开!CorelDRAWGraphicsSuit...
- java实现磁力链下载功能 java根据链接下载文件
-
#最值会员#下载会员哪家值?迅雷、QQ旋风、百度云会员对比作者:code54264前言:老夫的Q龄已经年了。从爪机时代的java到原始智能的Symbian再到现在两分天下的Android、ios,无...
- iOS UITextField 切换到表情键盘 ios表情输入法
-
iOS快速集成QQ表情键盘我们常在开发中需要制作常见的类似QQ的表情键盘,如果自己去实现会非常复杂,笔者推荐一个开源项目,集成非常简单。Demo演示:如果是UITextView,导入#import"...
- java windows 浮层 java分层窗格
-
“科技+IP”让中华优秀传统文化焕发新生近日,电影《哪吒2》票房再次刷新历史纪录,登顶全球动画电影票房榜首。《哪吒2》《黑神话:悟空》等围绕中国经典文化IP改编的文化娱乐作品,都以前沿视效技术与中华优...
- 63页战略分析逻辑架构图PPT,满足你对高效率和专业性的所有想象(附下载)
-
页战略分析逻辑架构图PPT模板,品牌营销战略的构成分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!页战略分析逻辑架构图PPT模板如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“...
- android屏蔽广告 host管理 爱玩机工具箱
-
彻底屏蔽安卓广告的实用指南,打造无广告安卓手机本内容来源于@什么值得买APP,观点仅代表作者本人|作者:期望氢气球在现代的移动设备中,广告无处不在,无论是在应用程序中还是在网页上。一方面作为安卓开发...
- IDC运维团队组织架构 idc运维工程师职责
-
IT运维岗位可以分为哪几种?个运维岗详解IT运维岗位可以分为哪几种呢?下面和千锋广州小编一起来看看吧!IT运维岗位以工作内容分类大致可以划分为以下几种岗位:IDC机房运维售前运维桌面运维监控运维实施运...
- 「软件架构」InfoQ 软件架构和设计趋势报告2020年4月
-
软件架构可能不是你想象的那个样子软件架构在敏捷社区中存在争议。在许多人的经验中,架构只会导致毫无价值的会议和无关紧要的文件,“地图不是领土”的说法可以恰当地概括这一观点。然而,架构不佳的应用程序很快就...
- 一周热门
- 最近发表
- 标签列表
-