java获取文件路径

1. 前言

Java 开发中咱们常常要获取文件的路径,好比读取配置文件等等。今天咱们就关于文件的路径和如何读取文件简单地探讨一下。java

2. 文件的路径

文件的路径一般有 相对路径绝对路径segmentfault

2.1 相对路径

以当前文件为基准进行一级级目录指向被引用的资源文件。在 Java 代码中以当前运行的代码所在的位置为参照位置,只要被引用的文件相对于引用的文件的位置不变就能够被读取到。一旦改变相对位置就没法被读取到。app

2.2 绝对路径

文件在文件系统中真正存在的路径,是指从硬盘的根目录(Windows为盘符)开始,进行一级级目录指向文件(从根目录一层层读写)。绝对路径顾名思义就是绝对的地址,就像你只要告诉别人你家的门牌号,他就能找到你家。而不是相对位置你告诉他在老王家的隔壁同样。函数

2.3 路径速记符

咱们常常看到一些文件目录路径使用一些符号来简写,这里有必要总结一下(以类 Unix系统为例):性能

标识符 说明
../ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录
/ 表示根目录
~ 当前用户目录, mac 下为 /Users/username,而 win10下为c:\users\username
Windows 下基本将 / 改成 \ 便可。

3. Java中读取文件

咱们先来声明一个测试路径:测试

foo
|_src
| |_Test.java
| |_app.yml

其中 Test.java 用来编写读取 app.yml 文件的逻辑。Java 中经过java.io.File 来进行文件操做。而且提供了如下三个方法来获取文件的路径。spa

3.1 getPath

该方法返回文件抽象路径名的字符串形式。实际上就是传递给 File 构造函数的路径名。code

所以,若是 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());

3.2 getAbsolutePath

该方法返回文件的绝对路径。请注意!这里是有大坑的。若是你的文件在 Java 工程内,路径是按照编译后的路径计算的。blog

File file = new File("./app.yml");
# absolutePath = /Users/dax/IdeaProjects/foo/./app.yml
System.out.println("absolutePath = " + absolutePath);

同时咱们发现该方法只解析当前目录(上面代码所在的目录)的相对路径,若是初始化中的路径包含了 2.3 章节 中的 速记符速记符 将不会被解析。

由于速记符的存在,一个文件在文件系统中的 绝对路径 能够有不少个。

3.3 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()

规范路径(不包含速记符)对于一个固定位置的文件来讲是惟一的。

关注公众号:Felordcn 获取更多资讯

我的博客:https://felord.cn