专栏首页技术小黑屋10年程序员都不一定搞清楚的文件路径

10年程序员都不一定搞清楚的文件路径

在 Java 中,文件是很常用的概念,这其中文件路径是一个很基础的内容,因为文件的创建,读取,写入和删除等操作都是依赖于文件路径的。但是你仔细看一下Java中 File的 API 你会发现有这样三个方法返回路径。

  • getPath(获取路径)
  • getAbsolutePath(获取绝对路径)
  • getCanonicalPath(获取规范路径)

了解这其中的差异,我们可以先看一看通用的路径的概念,即相对路径,绝对路径和规范路径。

文件路径中的特殊字符

  • . 用来代表当前的目录
  • .. 用来代表父目录
  • / 为Linux/Mac等操作系统的路径分隔符
  • \ 为 Windows 路径分隔符
  • : 为 Windows磁盘分割符,比如C:

相对路径

  • 相对路径指的是某个文件相对于当前目录的路径

举个例子

有两个文件,路径为

  • 文件 /tmp/a/a.txt
  • 目录 /tmp/b/

那么 * 文件(a.txt)相对当前目录(b)的相对路径就是../a/a.txt

绝对路径

  • 绝对路径指的是从文件系统的根目录到当前文件的路径。
  • 其中Windows的文件系统根目录可以是C:或者D:
  • Linux和Mac 等系统的根目录是/
  • 另外,对于同一个文件,可以存在多个不同的绝对路径。

同一文件的多个绝对路径

假设C盘下有temptemp1两个目录

C:\temp

C:\temp1

那么这些都是指向同一个文件的绝对路径,且都是合法的。

C:\temp\test.txt

C:\temp\test.txt

C:\temp\TEST.TXT

C:\temp\.\test.txt

C:\temp1\..\temp\test.txt

备注: Windows下路径不区分大小写。

Canonical路径 规范路径

  • 规范路径是从文件系统的根目录到当前文件的唯一的路径。
  • 规范路径不像绝对路径那样有多个不同的值指向同一文件。
  • 规范路径是绝对路径,但是绝对路径不一定是规范路径。
  • 规范路径中移除了...等特殊字符

举一个例子

一个相对路径为.././Java.txt的文件,

  • 它的绝对路径是 /Users/androidyue/Documents/projects/PathSamples/.././Java.txt
  • 它的规范路径是 /Users/androidyue/Documents/projects/Java.txt

备注:Canonical kə-ˈnä-ni-kəl 发音类似 可囊尼口

回到 Java File方法中

  • getPath 返回的路径可能是相对路径,也可能是绝对路径。
  • getAbsolutePath 返回的路径是绝对路径
  • getCanonicalPath 返回的路径是唯一的规范路径。

多说无益,上代码

import java.io.File;



public class PathDemo {

    public static void main(String args[]) {

        System.out.println("Path of the given file :");

        File child = new File(".././Java.txt");

        displayPath(child);

        File parent = child.getParentFile();

        System.out.println("Path of the parent folder :");

        displayPath(parent);





        File anotherFile = new File("a.txt");

        System.out.println("Path of another file(a.txt)");

        displayPath(anotherFile);



        File anotherAbsFile = new File("/tmp/a.txt");

        System.out.println("Path of another file(/tmp/a.txt)");

        displayPath(anotherAbsFile);

    }





    public static void displayPath(File testFile) {

        System.out.println("path : " + testFile.getPath());

        System.out.println("absolute path : " + testFile.getAbsolutePath());

        try {

            System.out.println("canonical path : " + testFile.getCanonicalPath());

        } catch (Exception e) {

            e.printStackTrace();

        }

    }



}

执行后,输出的日志为

Path of the given file :

path : .././Java.txt

absolute path : /Users/androidyue/Documents/projects/PathSamples/.././Java.txt

canonical path : /Users/androidyue/Documents/projects/Java.txt

Path of the parent folder :

path : ../.

absolute path : /Users/androidyue/Documents/projects/PathSamples/../.

canonical path : /Users/androidyue/Documents/projects

Path of another file(a.txt)

path : a.txt

absolute path : /Users/androidyue/Documents/projects/PathSamples/a.txt

canonical path : /Users/androidyue/Documents/projects/PathSamples/a.txt

Path of another file(/tmp/a.txt)

path : /tmp/a.txt

absolute path : /tmp/a.txt

canonical path : /private/tmp/a.txt



Process finished with exit code 0

References

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 和233酱一起刷leetcode系列

    Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google、微软、Faceboo...

    Monica2333
  • 《深入理解 Kotlin 协程》这书该怎么读?

    鼠年进入了尾声,想想过去的这一年还是发生了很多事情:终于有了回家的高铁,可刚回家没几天就又匆匆踏上了返京的旅途;写了一本书;做了一次线下的大会分享;做了两次线上...

    bennyhuo
  • 八招让你成为C/C++的编程大牛

    这个题目的噱头太大,要真的写起来, 足够写一本书了。 本人是过来人, 结合自身的体会和大家交流一下,希望新人能少走弯路。 每个人的情况不一样,我下面的描述可能并...

    程序员互动联盟
  • 我,Jeff Dean弟子,拒过Bengio的offer,还需要去混个本科学历么?

    Chris Olah,谷歌大脑研究员,OpenAI团队leader,和Jeff Dean、Yoshua Bengio都有密切的学术渊源。

    量子位
  • 黑客为啥瞧不上程序员?

    黑客目前在大家眼中还是飘着一层神秘的面纱,大家理解的黑客应该是无所不能,搞个密码,破解点游戏,甚至是攻击下服务器都是黑客的基本功。做个什么事情都显得异常轻松。 ...

    程序员互动联盟
  • 你应该知道的10种Python文件系统方法

    你可以编写Python程序来与文件系统进行交互来做很酷的事情。怎么做并不总是非常清楚。本文是当前和有抱负的开发人员和数据科学家的指南。我们将重点介绍10个基本的...

    银河1号
  • 你应该知道的10种Python文件系统方法

    你可以编写Python程序来与文件系统进行交互来做很酷的事情。怎么做并不总是非常清楚。本文是当前和有抱负的开发人员和数据科学家的指南。我们将重点介绍10个基本的...

    银河1号
  • “提需求的”与“拉SQL的”如何有效沟通

    这个题目改了又改,最终还是感觉这样写更具有可读性,毕竟一篇文章最终还是以能够读懂为初衷的,现阶段,各个公司里科技开发、数据编制成为必不可少的岗位,技术和业务的沟...

    Python数据科学
  • 微软、谷歌开发者大会终极PK:“AI First”的世界,谁的战略更清晰?

    【新智元导读】Techcrunch 的专栏作家 Frederic Lardinois 在参加了微软 Build 开发者大会和 Google I/O 大会后,认...

    新智元

扫码关注云+社区

领取腾讯云代金券