Java File类之getPath | getAbsolutePath | getCanonicalPath

一. API

以下是3个方法的api说明。

getPath

public String getPath()

将此抽象路径名转换为一个路径名字符串。所得字符串使用默认名称分隔符分隔名称序列中的名称。

返回:

此抽象路径名的字符串形式

 

getAbsolutePath

public String getAbsolutePath()

返回此抽象路径名的绝对路径名字符串。

如果此抽象路径名已经是绝对路径名,则返回该路径名字符串,这与 getPath() 方法一样。如果此抽象路径名是空抽象路径名,则返回当前用户目录的路径名字符串,该目录由系统属性 user.dir 指定。否则,使用与系统有关的方式解析此路径名。在 UNIX 系统上,根据当前用户目录解析相对路径名,可使该路径名成为绝对路径名。在 Microsoft Windows 系统上,根据路径名指定的当前驱动器目录(如果有)解析相对路径名,可使该路径名成为绝对路径名;否则,可以根据当前用户目录解析它。

返回:

绝对路径名字符串,它与此抽象路径名表示相同的文件或目录

抛出:

SecurityException - 如果无法访问所需的系统属性值。

另请参见:

isAbsolute()

 

getCanonicalPath

public String getCanonicalPath()

                        throws IOException

返回此抽象路径名的规范路径名字符串。

规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换为绝对路径名,这与调用 getAbsolutePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的名称(比如 "." 和 "..")、解析符号连接(对于 UNIX 平台),以及将驱动器号转换为标准大小写形式(对于 Microsoft Windows 平台)。

每个表示现存文件或目录的路径名都有一个惟一的规范形式。每个表示不存在文件或目录的路径名也有一个惟一的规范形式。不存在文件或目录路径名的规范形式可能不同于创建文件或目录之后同一路径名的规范形式。同样,现存文件或目录路径名的规范形式可能不同于删除文件或目录之后同一路径名的规范形式。

返回:

规范路径名字符串,它与此抽象路径名表示相同的文件或目录

抛出:

IOException - 如果发生 I/O 错误(可能是因为构造规范路径名需要进行文件系统查询)

SecurityException - 如果无法访问所需的系统属性值,或者存在安全管理器,且其 SecurityManager.checkRead(java.io.FileDescriptor) 方法拒绝对文件进行读访问

从以下版本开始:

JDK1.1

 

二. 代码示例

在实际编程中,我最常用到的就是getAbsolutePath方法,getCanonicalPath方法则比较陌生,对这三个方法直观浅显的理解就是:

getPath获取文件相对路径,用什么样的String构造的File对象,其getPath方法就返回什么样的String,当然,返回的String会矫正构造String中的文件分隔符错误,如重复的分隔符,其他操作系统平台的分隔符。

getAboulutePath获取文件的绝对路径,即获取的文件路径是从根目录开始的。

getCanonicalPath获取文件的规范路径,获取的文件路径不仅是从根目录开始的,而且还是规范的,会矫正文件路径中的大小写问题,会处理并移除文件路径中的定位符号(比如 "." 和 "..")。

 

我面临的问题就是,一个文件监控器,用来监控指定目录下文件的增、删、改情况。当对文件名进行大小写的修改时,监控器的识别会有问题。

由于Windows系统中文件名的大小写是无关紧要的,因此当修改文件名的大小写时,文件监控器虽然监听到了事件,但对事件进行验证时,发现文件还是那个文件,会认为文件没有发生任何变化,从而导致该事件会被忽略掉。

怎么办呢,只能启用getCanonicalPath方法,利用该方法纠正文件路径中的大小写问题,再进行后续的文件校验。

	public static void main(String[] args)
	{
		File file = new File("a\\b/c/d/../readME.txt");
		System.out.println("path: " + file.getPath());
		System.out.println("absolutePath: " + file.getAbsolutePath());
		
		try
		{
			System.out.println("canonicalPath: " + file.getCanonicalPath());
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	}

测试程序中,真实的文件名称为readme.txt,构造时传入的文件名称为readME.txt,使用相对路径,并使用了路径回退符号“..”。

 

代码输出结果:

path: a\b\c\d\..\readME.txt

absolutePath: D:\workspace\svn\zhangdan\TMD\a\b\c\d\..\readME.txt

canonicalPath: D:\workspace\svn\zhangdan\TMD\a\b\c\readme.txt

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值