欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【查漏补缺】File的path、absolutePath和canonicalPath的区别

程序员文章站 2022-11-27 16:32:38
背景 在学习Idea的插件开发时,用到了相关的 这个东西,里面的 有一个 方法引起了我的注意,我发现我不知道—— 科普 首先知晓一下几个名词—— 路径 、 绝对路径/相对路径 、 规范路径(不知道准不准确) 然后考虑以下几种路径: 1. c:\temp\file.txt 2. .\file.txt ......

背景

在学习idea的插件开发时,用到了相关的virtualfilesystem这个东西,里面的virtualfile有一个getcanonicalpath()方法引起了我的注意,我发现我不知道——

科普

首先知晓一下几个名词——路径绝对路径/相对路径规范路径(不知道准不准确)

然后考虑以下几种路径:

  1. c:\temp\file.txt
  2. .\file.txt
  3. c:\temp\myapp\bin\..\..\file.txt

第一类,属于路径,绝对路径,规范路径
第二类,属于路径,相对路径
第三类,属于路径,绝对路径

我们结合自己的开发经验,发现绝大多数情况都已经被覆盖到了,那么我们可以大致推测,路径包含绝对路径/相对路径绝对路径包含规范路径,而相对路径不包含规范路径

实战

/* -------这是一个规范路径的代码------- */
file file = new file("c:\\users\\w650\\desktop\\701studio\\app.js");
system.out.println("file.getabsolutepath()  -> " + file.getabsolutepath());
system.out.println("file.getcanonicalpath() -> " + file.getcanonicalpath());
system.out.println("file.getpath()          -> " + file.getpath());

/* -------输出------- */
file.getabsolutepath()  -> c:\users\w650\desktop\701studio\app.js
file.getcanonicalpath() -> c:\users\w650\desktop\701studio\app.js
file.getpath()          -> c:\users\w650\desktop\701studio\app.js
/* -------这是一个绝对路径的代码(但不规范)------- */
file file = new file("c:\\users\\w650\\desktop\\701studio\\utils\\..\\app.js");
system.out.println("file.getabsolutepath()  -> " + file.getabsolutepath());
system.out.println("file.getcanonicalpath() -> " + file.getcanonicalpath());
system.out.println("file.getpath()          -> " + file.getpath());

/* -------输出------- */
file.getabsolutepath()  -> c:\users\w650\desktop\701studio\utils\..\app.js
file.getcanonicalpath() -> c:\users\w650\desktop\701studio\app.js
file.getpath()          -> c:\users\w650\desktop\701studio\utils\..\app.js
/* -------这是一个相对路径的代码------- */
file file = new file("..\\..\\..\\test.txt");
system.out.println("file.getabsolutepath()  -> " + file.getabsolutepath());
system.out.println("file.getcanonicalpath() -> " + file.getcanonicalpath());
system.out.println("file.getpath()          -> " + file.getpath());

/* -------输出------- */
file.getabsolutepath()  -> e:\commonworkspace\ideaplugindevguide\devguide-virtualfilesystem\..\..\..\test.txt
file.getcanonicalpath() -> e:\test.txt
file.getpath()          -> ..\..\..\test.txt

结论

  1. 路径包含绝对路径相对路径绝对路径又包含了规范路径。
  2. getpath()会返回给用户创建file的路径getabsolutepath会依据调用该方法的类所在的路径 + 文件分隔符 + 创建file的路径构造绝对路径,getcanonicalpath()一定返回规范的路径。

参考

what's the difference between getpath(), getabsolutepath(), and getcanonicalpath() in java?